Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

Проблемы UDF   Найти похожие ветки 

 
Bizon's ©   (2004-07-13 23:51) [0]

Имеется функция:
function UpCase(InString: PChar): PChar; cdecl; export;
begin
 try
   Result:=StrNew(AnsiStrUpper(InString));
 except
   Result:=StrNew("");
 end;
end;

и скрипт DECLARE EXTERNAL FUNCTION UPCASE
CSTRING (512)
RETURNS CSTRING (512) FREE_IT
ENTRY_POINT "UpCase" MODULE_NAME "FUNC_UDF";


Когда в таблице много записей, то программа розрывает соединение и вылетает. Когда мало записей, то программа как будто работает.
В чем моя ошибка? И как его переделать?


 
Digitman ©   (2004-07-14 08:37) [1]

function UpCase(InString: PChar): PChar; cdecl;
var
 tempstr: String;
begin
 try
  tempstr := AnsiStrUpper(String(InString));  
  Result := StrCopy(InString, PChar(tempstr));  
 except
   Result := nil;
 end;
end;

DECLARE EXTERNAL FUNCTION UPCASE
CSTRING (512)
RETURNS CSTRING (512)
ENTRY_POINT "UpCase" MODULE_NAME "FUNC_UDF";


 
Digitman ©   (2004-07-14 08:40) [2]

p.s.

не забудь
IsMultiThread := True;
в теле begin..end в dpr библиотеки


 
Bizon's ©   (2004-07-14 18:40) [3]

С этим я согласен, когда мы передаем PChar, то его по ссылке можна вернуть в Result:

> tempstr := AnsiStrUpper(String(InString));  
> Result := StrCopy(InString, PChar(tempstr));  

Но когда параметров нет и нужно вернуть PChar, то для этого нужно выделить память(как я думаю). Как быть тогда? Как очистить память?


 
Digitman ©   (2004-07-14 18:48) [4]


> когда параметров нет и нужно вернуть PChar, то для этого
> нужно выделить память(как я думаю). Как быть тогда? Как
> очистить память?


параметра быть не может - null-строка, переданная сервером в UDF в виде cstring() (подчеркиваю - речь сейчас идет конкретно о cstring и ни о каком ином типе !), выглядит в теле UDF как строка нулевой длины, т.е. строка состоящая из единственного символа-терминатора.. иными словами, входной факт. параметр InString у тебя никогда не будет равен nil, что бы сервер ни передавал тебе ..

вот ее же и верни, если Result := nil не устраивает (возврат nil в дан.случае будет для сервера эквивалентен возврату null-строки)

и выделять/освобождать в этом случае ничего не надо - сервер сам об этом позаботится


 
Digitman ©   (2004-07-14 18:49) [5]


> параметра быть не может


очепятка .. читать как :

"параметра не быть не может"


 
Digitman ©   (2004-07-14 18:59) [6]


> Bizon"s ©   (14.07.04 18:40) [3]


манипуляции с памятью начинаются с момента, когда тип/размер возвращаемых из UDF данных заранее неизвестен (т.е. расчитывается динамически) .. если результ.размер превышает размер буфера факт.вх.параметра, вот тогда выделение памяти под него (и FREE_IT, соответственно) действительно необходимо

но только не так, как ты умудрился это проделать ...
в соответствии с соглашениями об использовании сервером и UDF единого менеджера памяти последнюю следует запрашивать с помощью ф-ции ib_util_malloc() из штатно поставляемой UDF-библиотеки ib_utils.dll, когда речь идет об FB1.5/YA последних версий .. для FB1 и IB6.x (и младших их версий) аналогичная ф-ция - malloc() из состава msvcrt.dll, так же как правило штатно поставляемой в дистрибутиве сервера



Страницы: 1 вся ветка

Текущий архив: 2004.08.08;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
1-1090838693
Bobic
2004-07-26 14:44
2004.08.08
Как в CheckListBox сохранить только отмеченые элементы


3-1089969922
Pilot
2004-07-16 13:25
2004.08.08
Index is out of date в Paradox


1-1090908906
lightix
2004-07-27 10:15
2004.08.08
Установить в программе формат вывода даты для DateTimePicker


1-1090685460
Mental_Ray
2004-07-24 20:11
2004.08.08
работе с TThread


14-1090575127
REP
2004-07-23 13:32
2004.08.08
Пятно от шариковой ручки