Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Караул! Помогите с UDF! [D6, IB6.x]


Dimedrol ©   (2002-10-01 16:18:00) 

Коллеги, ну что-то никак не получается...
Вроде писал раньше, но исходники похерил ;-)
В общем пишу на Kylix и Линухе UDF for Firebird.
Хочу чтобы при СЕЛЕКТе передавать ей 2 поля, и признак пустого
(типа, в нем строчка "None") и если поле НЕ пустое - без признака,
то показывать его, нет - другое. В принципе - простота!
Вот :

library reklamaf1;
uses SysUtils;
const libcmodulename = "libc.so.6";
function malloc(Size: LongWord): Pointer; cdecl; external libcmodulename name "malloc";

function OneEmpty(Val1,Val2,EmptyFlag:PChar): PChar; //тут и CDECL пробовал - не помогает
var v1,v2,emp,sBuf:string;
begin
//default val
sBuf:="default";
v1:=Trim(string(Val1));
v2:=Trim(string(Val1));
emp:=Trim(string(EmptyFlag));

if v2=emp then sBuf:=v1;
if v1=emp then sBuf:=v2;

Result := malloc(length(sBuf));
StrCopy(Result, pchar(sBuf));
end;

exports OneEmpty;
begin
end.


Описываю -

DECLARE EXTERNAL FUNCTION ONEEMPTY
CSTRING (384), //Пробовал и 255 - не помогает !
CSTRING (384),
CSTRING (8)
RETURNS CSTRING (384) FREE_IT
ENTRY_POINT "OneEmpty" MODULE_NAME "libreklamaf1";


Вызываю :


select OneEmpty("None", "wwwwwwwwwwww", "None") from rdb$database;

Так он мне то только 1-е значение возвращал,
то ща вообще "default" вернул...

Что я не так делаю ?
Помогите! ГорЮ !


Desdechado   (2002-10-02 10:18:00) [1]

возьми FreeUDFLib - там и под win, и под linux есть
см. www.ibase.ru


Dimedrol   (2002-10-02 09:21:00) [2]

Коллеги, у кого-нить вообще примеры создания подобных
УДФ есть ?
Да еще желательно под Линух...

Поделитесь плиз...


Dimedrol   (2002-10-01 23:30:00) [3]

У меня - Classic Server. Он висит на "сервисе", то бишь нет
подключений - нет и процессов.
Постоянно в памяти он не сидит.

А на счет SO... Да я ее физически убиваю кадый раз
и переписыываю на ее место новую...


Desdechado   (2002-10-01 19:28:00) [4]

перестартани FB и подсунь ему новую .SO
а то работает, видимо, старая


Dimedrol   (2002-10-01 18:47:00) [5]

Теперь вот что -

function OneEmpty(Val1,Val2,EmptyFlag:PChar): PChar; cdecl;
var v1,v2,emp,sBuf:string;
begin
//default val
sBuf:="default";

v1:=Trim(string(Val1));
v2:=Trim(string(Val2));
emp:=Trim(string(EmptyFlag));

if v2=emp then sBuf:=v1;
if v1=emp then sBuf:=v2;

Result := malloc(length(sBuf)+1);
StrCopy(Result, pchar(sBuf));
result[ Length(sBuf) + 1 ] := #0;
end;


Вызываю -
select OneEmpty("aaaaa", "bbbbbbb", "None") from rdb$database;
Result = "default"
Все верно...

Вызываю -
select OneEmpty("aaaaa", "bbbbbbb", "None") from rdb$database;
Result = "default"
Все верно...

Вызываю -
select OneEmpty("None", "bbbbb", "None") from rdb$database;
Result = "default"
ПОЧЕМУ ?????


Вызываю -
select OneEmpty("aaaaa", "None", "None") from rdb$database;
Result = "default"
ПОЧЕМУ ?????!!!!!!!!!!!!!!!!!!

Вызываю -
select OneEmpty("None", "None", "None") from rdb$database;
Result = "None"!!!!!!!!!!!1
Ничего не понимаю !!!!

8888888-(



Desdechado   (2002-10-01 17:49:00) [6]

v2:=Trim(string( Val2));
emp:=Trim(string(EmptyFlag));

if v2=emp then sBuf:=v1;
if v1=emp then sBuf:=v2;

Result := malloc(length(sBuf) +1);
StrCopy(Result, pchar(sBuf));
result[ Length(sBuf) + 1 ] := 0;

а CDECL поставь все равно


Наверх

Титульная страница Поиск, карта сайта Написать письмо