Delphi DLL/表单通信

发布于 2024-09-24 23:46:40 字数 205 浏览 2 评论 0原文

我已在 DLL 中嵌入了一个表单,可以调用该 DLL 并显示该表单并将各种函数从 DLL 返回到主应用程序,但是我无法弄清楚如何让 DLL 触发主应用程序表单中的事件。

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

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

I have embedded a form in a DLL and can call the DLL and show the form and return various functions from the DLL back to the main app, however I cannot figure out how to get the DLL to trigger events in the main applications form.

For example in the main app I have a dataset and I want to have a button on the form in the DLL to goto a certain record in the dataset but cannot see how this is done.

Can anybody could point me to an example or give me some pointers on how to to this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

滥情稳全场 2024-10-01 23:46:40

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

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

DLL 的接口将如下所示:

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 主机使用。

If a DLL needs to invoke behavior in the host application, then the host should provide a callback function to the DLL that the DLL stores and calls when appropriate.

Your DLL exports a function that tells it to display the form, right? Add a couple of parameters to that function for the EXE to provide a pointer to a callback function. The callback function should accept at least one parameter, which should be of type Pointer. The caller (the EXE) will use that parameter as a context parameter, some way for it to be reminded why the DLL is calling the EXE's function. Your DLL will store the function pointer and the context pointer, and when it's time for the DLL to tell the EXE something, it will call that function and pass the context value back. The DLL won't do anything with the context value; it's just something to store and pass back to the EXE verbatim.

The DLL's interface will look like this:

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

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

The EXE will define a callback function like this:

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

It will call the DLL function like this:

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

Notice how the signature of CallbackFunction matches the TDllcallback type defined earlier. Tey both use the stdcall calling convention, and they're both standalone functions, not methods. Avoid methods since method pointers are particular to Delphi, and you shouldn't require your DLL to be used only by Delphi hosts, if possible.

桃气十足 2024-10-01 23:46:40

由于 DLL 的代码在主应用程序的同一地址空间中执行,因此有多种通信方式。

  1. 在主应用程序中定义回调函数并将其地址提供给 DLL。
  2. 在主应用程序中定义消息处理程序,并从 DLL 发送消息以响应某些事件。
  3. ETC。

Because DLL's code being executed in the same address space of main application there are a plenty ways of doing communications.

  1. Define a callback function in the main app and give its address to the DLL.
  2. Define a message handler in the main app and send a message from DLL in response to some event.
  3. etc.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文