Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.27;
Скачать: CL | DM;

Вниз

Подключение внешней функции в 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
2-1198773700
art36
2007-12-27 19:41
2008.01.27
Перенос в TreeView


2-1199106232
VID
2007-12-31 16:03
2008.01.27
Выход на свойства компонента, имея его имя


15-1198175127
краснаЯ ГВАРДИЯ
2007-12-20 21:25
2008.01.27
задачи


2-1198831817
Ega23
2007-12-28 11:50
2008.01.27
ExcelWorkbook.WriteReserved


15-1197242225
Fixi4eeG
2007-12-10 02:17
2008.01.27
Установка компонентов Rxlib