Текущий архив: 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.46 MB
Время: 0.055 c