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

Общие вопросы программирования, алгоритмы и т.п.

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

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

Сообщение Osmiy » 16.05.2016 16:55:02

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

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

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

Работает как надо. Вопрос снят.
Всем спасибо.
Osmiy
новенький
 
Сообщения: 36
Зарегистрирован: 07.05.2016 21:18:39

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

Сообщение resident » 16.05.2016 21:59:08

Osmiy писал(а):Работает как надо. Вопрос снят.

Вот что значит, поговорить с умными людьми. :) (с) vada
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение yeger » 17.05.2016 10:41:11

А можно пример?
Аватара пользователя
yeger
новенький
 
Сообщения: 49
Зарегистрирован: 17.03.2011 12:26:34

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

Сообщение vada » 17.05.2016 11:52:50

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

А поделиться?
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

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

Сообщение Osmiy » 17.05.2016 13:36:40

Вот
Код: Выделить всё
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.     
Osmiy
новенький
 
Сообщения: 36
Зарегистрирован: 07.05.2016 21:18:39


Вернуться в Общее

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

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

Рейтинг@Mail.ru