Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];

Вниз

UDF для Firebird   Найти похожие ветки 

 
pavel_guzhanov ©   (2007-11-28 11:13) [0]

Пишу UDF для firebird. В ней используестя 4 функции. Три из них работают нормально, четвертая нет. Код:

library StrUdf;

uses
 SysUtils,
 Classes;

function malloc(Size:Integer):Pointer; cdecl; external "msvcrt.dll";

function LastName(Fio:PChar):PChar; cdecl; export;
var i:integer;
   f, tmp:String;
begin
 f:=String(trim(Fio));
 i:=Pos(" ", F);
 tmp:=Copy(F, 1, i-1);
 Result:=malloc(length(tmp)+1);
 StrPCopy(Result, tmp);
end;

function NomPasp(Nom:Integer):PChar; cdecl; export;
var len:Integer;
   NomPaspStr, tmp:String;
begin
 NomPaspStr:=IntToStr(Nom);
 len:=Length(NomPaspStr);
 case len of
   3: tmp:="000"+NomPaspStr;
   4: tmp:="00"+NomPaspStr;
   5: tmp:="0"+NomPaspStr;
 else
   tmp:=NomPaspStr;
 end;

 result:=malloc(length(tmp)+1);
 strPCopy(Result, tmp);
end;

exports
 LastName, NomPasp;
{$R *.res}

begin
end.


Первая функция получает на вход ФИО и возвращает только фамилию, работает нормально.
Вторая получает число, преобразует его в строку, если она короче 6 цифр, то дополняет его нулями. Если короче 3 цифр или длиннее 6, то оставляет без изменений и возвращает это строковое значение.

в базе эти функции объявлены так:

DECLARE EXTERNAL FUNCTION GET_LASTNAME
   CSTRING(84)
RETURNS CSTRING(84)
ENTRY_POINT "LastName" MODULE_NAME "StrUdf";


и

DECLARE EXTERNAL FUNCTION GET_NOMPASP
   INTEGER
RETURNS CSTRING(10)
ENTRY_POINT "NomPasp" MODULE_NAME "StrUdf";


Помогите разобраться, что я делаю не так в функции NomPasp?


 
pavel_guzhanov ©   (2007-11-28 11:14) [1]

Из 4 функций я в коде показал только две, одну работающую и одну не работающую


 
Slym ©   (2007-11-28 11:23) [2]

pavel_guzhanov ©   (28.11.07 11:14) [1]
Nom:Integer

Nom:PInteger?


 
Slym ©   (2007-11-28 11:24) [3]

strPCopy(Result, PChar(tmp));


 
Slym ©   (2007-11-28 11:25) [4]

Slym ©   (28.11.07 11:24) [3]
протупил


 
pavel_guzhanov ©   (2007-11-28 11:28) [5]


> Nom:PInteger?

А как его потом перевести в String?


 
Slym ©   (2007-11-28 11:31) [6]

IntToStr(Nom^)


 
Сергей М. ©   (2007-11-28 11:34) [7]

RETURNS CSTRING(10) FREE_IT

Иначе будет утечка.


 
pavel_guzhanov ©   (2007-11-28 11:35) [8]

Спасибо, все заработало


 
Сергей М. ©   (2007-11-28 11:43) [9]


> pavel_guzhanov


Вместо malloc() пользуй ib_util_malloc() из состава ib_utils.dll, иначе рано или поздно получишь грабли.

И проверь, что при инициализации твоей udf dll переменная IsMultiThread установлена в True, иначе опять же грабли.


 
Правильный_Вася   (2007-11-28 11:46) [10]

вообще-то все это прекрасно делается встроенными средствами



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.062 c
3-1195913561
Abadonne
2007-11-24 17:12
2008.04.20
Data provider or other service returned an E_FAIL status


2-1206282811
Илья
2008-03-23 17:33
2008.04.20
Подскажите, как можно перехватить все запускающиеся приложения?


15-1204470388
sniknik
2008-03-02 18:06
2008.04.20
Классная картинка!


2-1206209803
DJ_UZer
2008-03-22 21:16
2008.04.20
При открытии новой формы


2-1206100800
Oleg_teacher
2008-03-21 15:00
2008.04.20
RxRichedit+PopuMenu





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский