delphi - 函数 EXE 到 DLL (Delphi)

标签 delphi dll plugins export exe

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

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

现在我需要执行相反的操作,将函数从可执行文件导出到 DLL。

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

function GetMemo(): widestring;

在我看来,无论谁编写了 DLL 插件,当调用函数 GetMemo() 时,都已经获取了 DLL 中 TMemo 的内容。

可能吗?

最佳答案

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

关于delphi - 函数 EXE 到 DLL (Delphi),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46772580/

相关文章:

delphi - 使用环境变量 "The program can' 进行调试时无法启动,因为 ....dll 丢失”

c# - 为什么 AssemblyResolve 不起作用?

javascript - Indy 可以运行 Javascript 吗?

delphi - FNV的实现

windows - 为什么我的 UPnP 设备不返回在 UPnP SCPD xml 文件中注册的服务?

c# - 应用程序需要先在 GAC 中安装 log4net 程序集

c - 如何将 c 声明翻译成 delphi?

c# - 将 C# DLL 合并到 .EXE

plugins - 只是上传到Jcenter而不能导入到gradle

perl - 为什么 EPIC eclipse 插件不显示 "Explain Errors/Warnings"中的任何信息?