UDF для Firebird

Модератор: Модераторы

Сообщение don » 21.10.2005 11:16:56

Пересобираю UDF написанную на Delphi, собирается нормально,
а при использовании возвращается сообщение об ошибке, что функция не найдена.

Как побороть?
don
 

Сообщение Иван Шихалев » 22.10.2005 00:18:13

Попробовать явно указать name в списке exports.
Не использовать smartlink.
Exports не должно быть в модуле.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение Guest » 22.10.2005 09:57:20

<span style='font-family:courier'>//Исходный код

library udflib;

{$ALIGN OFF}
{$mode objfpc}
{$smartlink off}
{$PACKRECORDS C}


uses
SysUtils,
Classes;

{DECLARE EXTERNAL FUNCTION IOR
longint,
longint
RETURNS longint BY VALUE
ENTRY_POINT 'fn_or' MODULE_NAME 'udflib.so'}


function fn_or(var I1,I2: longint) : longint; cdecl; export;
begin

Result := I1 or I2;
end;

exports

fn_or name 'fn_or';
end.</span>
Guest
 

Сообщение don » 22.10.2005 10:28:45

Прошу прощения это был мой пост
don
 

Сообщение don(Дмитрий Филиппов) » 22.10.2005 10:36:15

>Зачем тут Lazarus?
>Какая версия FPC?

В лазаре удобнее править и можно идентифицировать FPC по версии лазаря
Версия FPC 2.0.0 (2005/05/08)

при компиляции с помощью лазаруса или без него имеем разницу в размере библиотеки, а эффект тот же.
don(Дмитрий Филиппов)
 

Сообщение Nikolaich » 18.04.2006 15:29:57

Уважаемые форумчане! Первый опыт написания UDF на FPC в Lazarus. Поэтому очень надеюсь на ответ и не судите строго, ежели обнаружите явные ошибки в моей ДНК ;)

Имеется проект библиотеки:
Код: Выделить всё
library StageUDF;

{$ALIGN OFF}
{$mode objfpc}
{$smartlink off}
{$PACKRECORDS C}

uses
 StageLibrary in 'StageLibrary.pas'
 { add your units here };

exports
 ServerDate name 'ServerDate';

begin
end.

и
Код: Выделить всё
unit StageLibrary;

{$mode objfpc}{$H+}

interface

uses
 Classes, SysUtils;

type

 PIBDateTime = ^TIBDateTime;
 TIBDateTime = record
   Days,                           // Date: Days since 17 November 1858
   MSec10 : Integer;               // Time: Millisecond * 10 since midnigth
 end;

function ToDelphiDate(const aIBDateTime: TIBDateTime): TDateTime;
function ServerDate(var ServerIBDateTime: TIBDateTime): PIBDateTime; cdecl; export;

implementation

const                               // Date translation constants
 MSecsPerDay10 = MSecsPerDay * 10; // Milliseconds per day * 10
 IBDateDelta = 15018;              // Days between Delphi and InterBase dates

function ToDelphiDate(const aIBDateTime: TIBDateTime): TDateTime;
begin
 with aIBDateTime do
   Result := Days - IBDateDelta + MSec10 / MSecsPerDay10;
end;

function ServerDate(var ServerIBDateTime: TIBDateTime): PIBDateTime; cdecl; export;
var
 DelphyDays : Integer;
begin
 DelphyDays := Trunc(Now);
 with ServerIBDateTime do begin
   Days := DelphyDays + IBDateDelta;
   MSec10 := Trunc((Now - DelphyDays) * MSecsPerDay10);
 end;
 Result := @ServerIBDateTime;
end;

end.                              

В Lasarus (v 0.9.14) компилируется, в InterBase выдает
<span style='color:red'>
Invalid token.
invalid request BLR at offset 448.
function FP_SERVERDATE is not defined.
module name or entrypoint could not be found.
</span>
После компиляции в Delphi работает замечательно.

Читал эту ветку форума, вроде бы поправил все, что было раньше, в соответствии с тутошними рекомендациями - ничего не помогает :(
Укажите, плизь, где моя криворукость?
Заранее признателен.
Nikolaich
незнакомец
 
Сообщения: 2
Зарегистрирован: 18.04.2006 15:17:47

Сообщение Nikolaich » 18.04.2006 15:34:38

Прошу прощения, не указал, как регистрировал на IB-сервере. Вот так:
Код: Выделить всё
declare external function fp_serverdate
 date
returns
 date
entry_point "ServerDate"
module_name "StageUDF";


StageUDF.dll куда надо не забыл положить :)
Nikolaich
незнакомец
 
Сообщения: 2
Зарегистрирован: 18.04.2006 15:17:47

Сообщение Константин » 19.04.2006 12:02:01

А вы попробуйте выполнить какую-либо функцию из вашей библиотеке,
в тестовой программке м вы всё поймете.
Я задавал уже подобный вопрос.
При подкрузке библиотеке RTLD пытается найти main, а он "undefined".
Вот тред: <a href='http://www.dore.ru/perl/nntp.pl?f=1&gid=22&mid=22672' target='_blank'>http://www.dore.ru/perl/nntp.pl?f=1&gid=22&mid=22672</a>
Константин
 


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru