![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы UDF
Bizon's © (2004-07-13 23:51:00)Имеется функция:
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 18:59:00) [1]
> 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, так же как правило штатно поставляемой в дистрибутиве сервера
Digitman (2004-07-14 18:49:00) [2]
> параметра быть не может
очепятка .. читать как :
"параметра небыть не может"
Digitman (2004-07-14 18:48:00) [3]
> когда параметров нет и нужно вернуть PChar, то для этого
> нужно выделить память(как я думаю). Как быть тогда? Как
> очистить память?
параметра быть не может - null-строка, переданная сервером в UDF в виде cstring() (подчеркиваю - речь сейчас идет конкретно о cstring и ни о каком ином типе !), выглядит в теле UDF как строка нулевой длины, т.е. строка состоящая из единственного символа-терминатора.. иными словами, входной факт. параметр InString у тебя никогда не будет равен nil, что бы сервер ни передавал тебе ..
вот ее же и верни, если Result := nil не устраивает (возврат nil в дан.случае будет для сервера эквивалентен возврату null-строки)
и выделять/освобождать в этом случае ничего не надо - сервер сам об этом позаботится
Bizon's (2004-07-14 18:40:00) [4]С этим я согласен, когда мы передаем PChar, то его по ссылке можна вернуть в Result:
> tempstr := AnsiStrUpper(String(InString));
> Result := StrCopy(InString, PChar(tempstr));
Но когда параметров нет и нужно вернуть PChar, то для этого нужно выделить память(как я думаю). Как быть тогда? Как очистить память?
Digitman (2004-07-14 08:40:00) [5]p.s.
не забудь
IsMultiThread := True;
в теле begin..end в dpr библиотеки
Digitman (2004-07-14 08:37:00) [6]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';