Главная страница
    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.46 MB
Время: 0.055 c
14-1090245547
Ega23
2004-07-19 17:59
2004.08.08
Коллеги, подскажите форум.


3-1089608096
DENpro
2004-07-12 08:54
2004.08.08
BackUp Interbase


1-1090925053
Фагот
2004-07-27 14:44
2004.08.08
Про sleep


3-1089631537
kj
2004-07-12 15:25
2004.08.08
Как выбрать текущую дату в interbase?


14-1089924644
Baron
2004-07-16 00:50
2004.08.08
Обсуждение опроса.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский