Delphi DLL /表单通信

col*_*lin 3 delphi dll

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

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

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

Rob*_*edy 9

如果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;
Run Code Online (Sandbox Code Playgroud)

EXE将定义一个回调函数,如下所示:

function CallbackFunction(Context: Pointer): DWord; stdcall;
begin
  TMainForm(Context).DoSomething;
  Result := 0;
end;
Run Code Online (Sandbox Code Playgroud)

它会像这样调用DLL函数:

procedure TMainForm.DoDllTaskClick(Sender: TObject);
begin
  DisplayForm(Handle, CallbackFunction, Pointer(Self));
end;
Run Code Online (Sandbox Code Playgroud)

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