函数EXE到DLL(Delphi)

问题描述:

我正在调制我的应用程序以使用单独的模块(插件)。函数EXE到DLL(Delphi)

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

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

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

function GetMemo(): widestring; 

在我的想法,谁写的DLL插件,调用功能GetMemo(时),就已经把TMemo的内容DLL。

有可能吗?

+0

应用程序的消费者将不得不做的相当多的工作。最好把你的表单放在一个DLL中。 – Victoria

+0

当然这是可能的。可执行文件可以导出函数。尽管为插件提供COM接口可能会更好。很难用很少的信息来指导设计。 –

+0

既可以使用Delphi本地类型,也可以编写BPL,就像Delphi本身编写的一样,或者坚持使用Microsoft COM标准,但它需要学习额外的工具,如外部类型(接口)定义 –

处理此问题的最简单方法是定义函数指针的记录,然后让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; 
+0

请问我该如何在google上搜索以找出更多关于这个问题? –

+0

谢谢你雷米Lebeau! –

+0

此块 PPluginExeFunctions =^MyFunctions; “MyFunction”是GetMemo? –