![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подключение внешней функции в IB Expert
Егоров А.Н. © (2007-09-21 20:28:00)Подскажите, кто знает, - как нужно подключить внешнюю функцию в 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" отклонено администратором сервера.
Что не так? Объясните, пожалуйста.
Виталий Панасенко(дом) (2007-09-22 13:17:00) [1]Есть готовые UDF, при чем бесплатные.. ищи на IBASE.RU
Егоров А.Н. (2007-09-22 11:37:00) [2]>Johnmen
> ... зачем вообще нужен этот гуид в данном случае?
Хотелось иметь возможность формировать GUID-ы в разрабатываемой программе для передачи уже готовых данных в бухгалтерскую программу БЭСТ-5, где они используется в родных базах (FoxPro 3). Тогда у меня будет по одному полю GUID в разрабатываемой базе для связи между базами, вместо наборов полей для поиска и фильтрации.
Johnmen (2007-09-21 22:08:00) [3]
> Егоров А.Н. (21.09.07 20:28)
Да, и кстати, а зачем вообще нужен этот гуид в данном случае?
Johnmen (2007-09-21 22:06:00) [4]Читать наизусть http://www.ibase.ru/devinfo/udf_ok.htm
Desdechado (2007-09-21 21:18:00) [5]FB не разрешает подключать UDF из DLL в посторонних папках. Или нужно настроить firebird.conf на эту папку, или использовать папку UDF по умолчанию в папке с установленных FB.
И, само собой, выполнить соглашения о вызовах. Подробности на ibase.ru
palva (2007-09-21 21:09:00) [6]Для использования в IB функция должна быть написана специальным образом. В частности, не будут работать дельфийские string-параметры, нужно передавать их как PChar.
Если используете FREE_IT то память под строку также нужно выделять специальным образом.
Прочитайте об этом в книжке Ковязина или поищите пример в Интернете.