UDF для Firebird

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

Ответить
don

Сообщение don »

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

Как побороть?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Попробовать явно указать name в списке exports.
Не использовать smartlink.
Exports не должно быть в модуле.
Guest

Сообщение Guest »

<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>
don

Сообщение don »

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

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

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

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

при компиляции с помощью лазаруса или без него имеем разницу в размере библиотеки, а эффект тот же.
Nikolaich
незнакомец
Сообщения: 2
Зарегистрирован: 18.04.2006 15:17:47

Сообщение Nikolaich »

Уважаемые форумчане! Первый опыт написания 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 »

Прошу прощения, не указал, как регистрировал на IB-сервере. Вот так:

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

declare external function fp_serverdate
  date
returns
  date
entry_point "ServerDate"
module_name "StageUDF";


StageUDF.dll куда надо не забыл положить :)
Константин

Сообщение Константин »

А вы попробуйте выполнить какую-либо функцию из вашей библиотеке,
в тестовой программке м вы всё поймете.
Я задавал уже подобный вопрос.
При подкрузке библиотеке 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>
Ответить