Главная страница
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.035 c
14-1090247304
ninja
2004-07-19 18:28
2004.08.08
Help по базам данных


1-1090471679
Grayver
2004-07-22 08:47
2004.08.08
Редактирование ячейки в Excel


14-1090613819
Косто
2004-07-24 00:16
2004.08.08
Подскажите что из литературы стоит почитать...


1-1090594134
fess
2004-07-23 18:48
2004.08.08
Re Chart


14-1089989650
ruslan
2004-07-16 18:54
2004.08.08
WebBrowser