我已经在DLL中嵌入了一个表单,可以调用DLL并显示表单并将各种函数从DLL返回到主应用程序,但是我无法弄清楚如何让DLL在主应用程序中触发事件形成。
例如在主应用程序中我有一个数据集,我想在DLL中的表单上有一个按钮来转到数据集中的某个记录但是看不到这是怎么做的。
任何人都可以给我一个例子,或者给我一些关于如何做到这一点的指示吗?
答案 0 :(得分: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;
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
类型匹配。 Tey都使用stdcall调用约定,它们都是独立函数,而不是方法。避免使用方法,因为方法指针特别适用于Delphi,如果可能,您不应该要求您的DLL仅由Delphi主机使用。
答案 1 :(得分:2)
因为DLL的代码在主应用程序的相同地址空间中执行,所以有很多方法可以进行通信。