函数EXE到DLL(Delphi)

时间:2017-10-16 14:21:01

标签: delphi dll plugins export exe

我正在调整我的应用程序以使用单独的模块(插件)。

我已成功读取EXE应用程序并加载插件,包括表单。

现在我需要执行从可执行文件到DLL的反向导出函数。

实施例: 在我的可执行文件中,它有一个TMemo组件。我想创建一个像这样的函数

function GetMemo(): widestring;

在我的想法中,无论是谁编写DLL插件,在调用函数GetMemo()时,都会在DLL中获取TMemo的内容。

有可能吗?

2 个答案:

答案 0 :(得分:4)

处理此问题的最简单方法是定义函数指针的记录,然后让EXE在初始化时将该记录的实例传递给每个插件。然后,EXE可以根据需要实现这些功能并将它们传递给插件,而不必像DLL那样从PE导出表中实际导出它们。

例如:

type
  PPluginExeFunctions = ^PluginExeFunctions;
  PluginExeFunctions = record
    GetMemo: function: WideString; stdcall;
   ...
  end;

function MyGetMemoFunc: WideString; stdcall;
begin
  Result := Form1.Memo1.Text;
end;

...

var
  ExeFuncs: PluginExeFunctions;
  hPlugin: THandle;
  InitFunc: procedure(ExeFuncs: PPluginExeFunctions); stdcall;
begin
  ExeFuncs.GetMemo := @MyGetMemoFunc;
  ...
  hPlugin := LoadLibrary('plugin.dll');
  @InitFunc := GetProcAddress(hPlugin, 'InitializePlugin');
  InitFunc(@ExeFuncs);
  ...
end;

var
  ExeFuncs: PluginExeFunctions;

procedure InitializePlugin(pExeFuncs: PPluginExeFunctions); stdcall;
begin
  ExeFuncs := pExeFuncs^;
end;

procedure DoSomething;
var
  S: WideString;
begin
  S := ExeFuncs.GetMemo();
  ...
end;

答案 1 :(得分:0)

unit uDoingExport;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

procedure testproc; stdcall;

implementation

{$R *.dfm}

procedure testproc;
begin
   ShowMessage('testproc');
End;

exports
   testproc;

end.

我只是在单元界面中的EXE中添加了要发布的方法,在实现中添加了导出(方法名)。我使用的是stdcall而不是cdecl。

在我的孩子中,我可以加载exe文件...或者您可以像Apache一样疯狂一些,在前面的代码中,添加一个加载库,该加载库可以加载DLL,实习生可以对该调用者进行加载。 / p>

我的意思是要表明,您的EXE就像是一个DLL(只是一个不同的二进制标头),反之亦然。只是打出口。证明它有效,我对EXE进行了转储:

Exports from ProjDoingExport.exe
  1 exported name(s), 1 export addresse(s).  Ordinal base is 1.
  Sorted by Name:
    RVA      Ord. Hint Name
    -------- ---- ---- ----
    0005294C    1 0000 testproc
  • 我知道,答案很晚,但是,这是一个很好的问题!