函数EXE到DLL(Delphi)
我正在调制我的应用程序以使用单独的模块(插件)。函数EXE到DLL(Delphi)
我已经成功地让我的EXE应用程序读取并加载插件,包括表单。
现在我需要做可执行文件到DLL的反向导出函数。
例如: 在我的可执行文件中,它有一个TMemo组件。我想创建这样的函数
function GetMemo(): widestring;
在我的想法,谁写的DLL插件,调用功能GetMemo(时),就已经把TMemo的内容DLL。
有可能吗?
处理此问题的最简单方法是定义函数指针的记录,然后让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;
请问我该如何在google上搜索以找出更多关于这个问题? –
谢谢你雷米Lebeau! –
此块 PPluginExeFunctions =^MyFunctions; “MyFunction”是GetMemo? –
应用程序的消费者将不得不做的相当多的工作。最好把你的表单放在一个DLL中。 – Victoria
当然这是可能的。可执行文件可以导出函数。尽管为插件提供COM接口可能会更好。很难用很少的信息来指导设计。 –
既可以使用Delphi本地类型,也可以编写BPL,就像Delphi本身编写的一样,或者坚持使用Microsoft COM标准,但它需要学习额外的工具,如外部类型(接口)定义 –