gpt4 book ai didi

Delphi DLL/表单通信

转载 作者:行者123 更新时间:2023-12-03 15:41:33 28 4
gpt4 key购买 nike

我在 DLL 中嵌入了一个表单,可以调用 DLL 并显示表单并将各种函数从 DLL 返回到主应用程序,但是我不知道如何让 DLL 触发主应用程序中的事件形式。

例如,在主应用程序中,我有一个数据集,我想在 DLL 中的表单上有一个按钮来转到数据集中的某个记录,但无法看到这是如何完成的。

任何人都可以给我举个例子或者给我一些关于如何做到这一点的指示吗?

最佳答案

如果 DLL 需要调用主机应用程序中的行为,则主机应向 DLL 提供回调函数,以便 DLL 在适当的时候存储和调用。

你的 DLL 导出一个函数来告诉它显示表单,对吧?向该函数添加几个参数,以便 EXE 提供指向回调函数的指针。回调函数应至少接受一个参数,该参数的类型应为Pointer。调用者(EXE)将使用该参数作为上下文参数,以某种方式提醒它为什么 DLL 正在调用 EXE 的函数。您的 DLL 将存储函数指针和上下文指针,当 DLL 需要告诉 EXE 某些信息时,它将调用该函数并将上下文值传回。 DLL 不会对上下文值执行任何操作;它只是要存储并逐字传回 EXE 的内容。

DLL 的接口(interface)如下所示:

type
TDllCallback = function(Context: Pointer): DWord; stdcall;

function DisplayForm(Parent: HWnd; Callback: TDllCallback; Context: Pointer): DWord; stdcall; external Dll;

EXE 将定义如下回调函数:

function CallbackFunction(Context: Pointer): DWord; stdcall;
begin
TMainForm(Context).DoSomething;
Result := 0;
end;

它将像这样调用 DLL 函数:

procedure TMainForm.DoDllTaskClick(Sender: TObject);
begin
DisplayForm(Handle, CallbackFunction, Pointer(Self));
end;

请注意 CallbackFunction 的签名如何与之前定义的 TDllcallback 类型相匹配。它们都使用 stdcall 调用约定,并且它们都是独立函数,而不是方法。避免使用方法,因为方法指针是 Delphi 特有的,并且如果可能的话,您不应该要求您的 DLL 只能由 Delphi 主机使用。

关于Delphi DLL/表单通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3806636/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com