Главная страница
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.086 c
3-1089955641
Rater
2004-07-16 09:27
2004.08.08
dbf поле длинна 2 тип Numeric. В RunTime создать можно?


14-1090260768
ИМХО
2004-07-19 22:12
2004.08.08
You know: Мазуту, Алексу и всем-всем-всем...


3-1089140482
Elicei
2004-07-06 23:01
2004.08.08
Локальное->Клиент-Серверное


1-1089611530
Pavelkq
2004-07-12 09:52
2004.08.08
ПрогрессБар в юните


14-1090716395
dr Tr0jan
2004-07-25 04:46
2004.08.08
Всех, имеющих отношение к ВМФ, с праздником - днем ВМФ