Страница 1 из 1

Экспорт функции из исполняемого файла

СообщениеДобавлено: 16.05.2016 16:55:02
Osmiy
Знаю что в Виндовс исполняемый файл может экспортировать функции как обычная DLL. На практике проверять не стал, а сразу стал проверять такую же штуку в Линукс. Мне нужна кроссплатформенность. При попытке динамически загрузить модуль исполняемого файла возвращается ошибка: "динамическая загрузка исполняемого файла не возможна" .
Можно ли как-то обойти это ограничение?

И еще
Может ли исполняемый файл сам передавать указатели на свои функции в динамические библиотеки, которые она будет вызывать?
Если ли в Линуксе аналог виндовского SendMessage

Добавлено спустя 48 минут 32 секунды:
Проверил вот это
Osmiy писал(а):Может ли исполняемый файл сам передавать указатели на свои функции в динамические библиотеки, которые она будет вызывать?

Работает как надо. Вопрос снят.
Всем спасибо.

Re: Экспорт функции из исполняемого файла

СообщениеДобавлено: 16.05.2016 21:59:08
resident
Osmiy писал(а):Работает как надо. Вопрос снят.

Вот что значит, поговорить с умными людьми. :) (с) vada

Re: Экспорт функции из исполняемого файла

СообщениеДобавлено: 17.05.2016 10:41:11
yeger
А можно пример?

Re: Экспорт функции из исполняемого файла

СообщениеДобавлено: 17.05.2016 11:52:50
vada
Работает как надо. Вопрос снят. Всем спасибо.

А поделиться?

Re: Экспорт функции из исполняемого файла

СообщениеДобавлено: 17.05.2016 13:36:40
Osmiy
Вот
Код: Выделить всё
unit Unit1;

{$mode delphi}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

function GetInteger: Integer;

implementation

uses
  dynlibs;

var
  hLib: TLibHandle;

  GetPlagin: function(F:Pointer):Integer;

const
  F: function:Integer = @GetInteger;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  hLib:= LoadLibrary('./libproject2.so');
  Assert(hLib<>0);

  GetPlagin:= GetProcedureAddress(hLib, 'GetPlagin');
  Assert(@GetPlagin<>nil);

  Caption:= IntToStr(GetPlagin(@GetInteger));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption:= IntToStr(GetPlagin(@F));
end;

function GetInteger: Integer;
begin
  Result:= StrToInt(Form1.Edit1.Text);
end;

initialization
  {$I unit1.lrs}

end. 


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

{$mode delphi}{$H+}

uses
  Classes
  { you can add units after this };

var
  GetInteger: function: Integer;


function GetPlagin(F:Pointer): Integer;
begin
  GetInteger:= F;
  Result:= GetInteger;
end;

exports
  GetPlagin;

begin
end.