我正在调整我的应用程序以使用单独的模块(插件)。
我已成功读取EXE应用程序并加载插件,包括表单。
现在我需要执行从可执行文件到DLL的反向导出函数。
实施例: 在我的可执行文件中,它有一个TMemo组件。我想创建一个像这样的函数
function GetMemo(): widestring;
在我的想法中,无论是谁编写DLL插件,在调用函数GetMemo()时,都会在DLL中获取TMemo的内容。
有可能吗?
答案 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