传统调用DLL窗体,为了达到DLL窗体与主程序融为一体的效果,通常会把主程序的Application传递到DLL工程中,类似如下方法:
procedure SynAPP(App: THandle); stdcall;
begin
//传递Application
Application.Handle:= App;
end;
或者直接把Application作为参数传递的:
procedure DLLEntryPoint(Reason: DWORD);
begin
case Reason of
DLL_PROCESS_ATTACH:
begin
DLLApp:=Application;//DLL初始化记录原始Application
dxUnitsLoader.Initialize;
end;
DLL_PROCESS_DETACH:
begin
Application:=DllApp;//DLL释放还原Application
dxUnitsLoader.Finalize;
end;
end;
end;
方案一,无法达到最终需要的效果,方案二直接在调用时报错(XE2报错,D7不报错,尴尬=。=!)
后来经过研究,在XE2下找到了方法,可以完美融合主程序和DLL窗口,在任务栏中只有一个窗口,同时支持DLL窗口的最大、最小化等。放代码:
//这是DLL中调用方法的代码:
function ShowWaitMsg(ParentFormHandle: THandle): Integer; stdcall;
var
aForm: TFormDLL;
begin
Application.Handle := ParentFormHandle; //将调用主窗口的句柄赋值为Application.Handle即可
aForm := TFormDLL.Create(Application);
aForm.ShowModal;
FreeAndNil(aForm);
end;