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

Вниз

Подключение внешней функции в IB Expert   Найти похожие ветки 

 
Егоров А.Н.   (2007-09-21 20:28) [0]

Подскажите, кто знает, - как нужно подключить внешнюю функцию в IB Expert (сам пока слаб в Firebird).

Имею DLL b5common.dll в папке C:\WINDOWS\system32. В ней содержится функция genguid22, которая генерирует GUID длиной 22 символа.
DLL-ка не случайна, т.к. создаваемая база будет работать с бухгалт.программой БЭСТ-5. Задача - при вставке новой записи в FIB-таблицу PARTNER самой базой должен генерироваться part_id=GUID(22).

В Delphi проблем нет. Имею модуль:

unit ImportGUID22;

interface

uses
 Windows;

function CreateB5Guid22() : string;

implementation

uses SysUtils;
{$EXTERNALSYM genguid22}
function genguid22(S: PAnsiChar): BOOL; stdcall; external "b5common.dll";

function CreateB5Guid22() : string;
begin
 // перед вызовом genguid22 буфер должен существовать!!!
 Result := StringOfChar(" ", 22);
end;

end.


Здесь описана функция CreateB5Guid22. Затем при добавлении записи в PARTNER вызываю:

pFIBDataSet_PARTNER.Fields[0].AsString:=CreateB5Guid22;

и все работает в лучшем виде, но мне надо добиться чтобы база сама перед вставкой новой записи генерировала этот GUID.

Пробовал написать UDF функцию:

DECLARE EXTERNAL FUNCTION GEN_GUID
RETURNS VARCHAR(22) FREE_IT
ENTRY_POINT "genguid22" MODULE_NAME "C:\WINDOWS\system32\b5common.dll";


Затем создаю триггер PARTNER_BIO:

AS
begin
 IF (NEW.part_id IS NULL) THEN
   NEW.part_id = gen_guid();
end


При компиляции сам триггер создается, но на COMMIT выдается ошибка:

Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
Access to UDF/BLOD-filter module "C:\WINDOWS\system32\b5common.dll" is denied by server administrator.


Что в переводе:

Неудачное выполнение, вызванное ошибкой системы, которая препятствует успешному выполнению последующих инструкций.
Обращение к модулю UDF/BLOD-фильтра "C:\WINDOWS\system32\b5common.dll"  отклонено администратором сервера.


Что не так? Объясните, пожалуйста.


 
palva ©   (2007-09-21 21:09) [1]

Для использования в IB функция должна быть написана специальным образом. В частности, не будут работать дельфийские string-параметры, нужно передавать их как PChar.
Если используете FREE_IT то память под строку также нужно выделять специальным образом.
Прочитайте об этом в книжке Ковязина или поищите пример в Интернете.


 
Desdechado ©   (2007-09-21 21:18) [2]

FB не разрешает подключать UDF из DLL в посторонних папках. Или нужно настроить firebird.conf на эту папку, или использовать папку UDF по умолчанию в папке с установленных FB.
И, само собой, выполнить соглашения о вызовах. Подробности на ibase.ru


 
Johnmen ©   (2007-09-21 22:06) [3]

Читать наизусть http://www.ibase.ru/devinfo/udf_ok.htm


 
Johnmen ©   (2007-09-21 22:08) [4]


> Егоров А.Н.   (21.09.07 20:28) 

Да, и кстати, а зачем вообще нужен этот гуид в данном случае?


 
Егоров А.Н.   (2007-09-22 11:37) [5]

>Johnmen

> ... зачем вообще нужен этот гуид в данном случае?


Хотелось иметь возможность формировать GUID-ы в разрабатываемой программе для передачи уже готовых данных в бухгалтерскую программу БЭСТ-5, где они используется в родных базах (FoxPro 3). Тогда у меня будет по одному полю GUID в разрабатываемой базе для связи между базами, вместо наборов полей для поиска и фильтрации.


 
Виталий Панасенко(дом)   (2007-09-22 13:17) [6]

Есть готовые UDF, при чем бесплатные.. ищи на IBASE.RU



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

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

Наверх





Память: 0.47 MB
Время: 0.007 c
2-1197404563
Rustam
2007-12-11 23:22
2008.01.27
пинг


3-1190274164
thely
2007-09-20 11:42
2008.01.27
Бесплатные утилиты для ремонта GDB?


9-1165928759
Creative
2006-12-12 16:05
2008.01.27
Как рисовать 3D и 2D объекты в одной сцене?


2-1198874373
den11111
2007-12-28 23:39
2008.01.27
Как открыть сетевое подключение


2-1198576815
Washington
2007-12-25 13:00
2008.01.27
Системная информация





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