Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подключение внешней функции в 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 то память под строку также нужно выделять специальным образом.
Прочитайте об этом в книжке Ковязина или поищите пример в Интернете.


Наверх

Титульная страница Поиск, карта сайта Написать письмо