Форум: "Базы";
Текущий архив: 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