我在DLL中有一个Delphi表单(我知道这限制了DLL对Delphi的使用,但在这种情况下这不是问题)。
DLL导出一个大致如下的函数ShowForm
:
procedure ShowForm (App : TApplication);
begin
OldApp := Application;
try
Application := App;
MyForm := TMyForm.Create (nil);
try
MyForm.ShowModal;
finally
FreeAndNil (MyForm);
end;
finally
Application := OldApp;
end;
end;
现在在表单上我使用TAdvOfficeHint
(来自TMS组件包)。不幸的是,提示没有出现。
我在这里遗漏了什么吗?如何使表单的行为与从主应用程序中显示的表单完全相同?
谢谢!
答案 0 :(得分:5)
我不知道TAdvOfficeHint
但我猜它挂钩Application.OnShowHint
来设置自己的THintWindowClass
,即使主要可执行文件和DLL都在TMS单元中链接,他们每个人都有自己的班级副本,这是出错的地方。
分配Application
是不够的:还有其他全局变量,例如Screen
,Mouse
等。其他甚至隐藏在实现中,所以我说你有机会< em>使表单的行为与主应用程序完全相同很小。
答案 1 :(得分:1)
应用程序设置错误。
试试这个,看看它是否解决了你的问题:
procedure ShowForm (AppHandle : THandle);
begin
OldAppHandle := Application.Handle;
try
Application.Handle := AppHandle;
........
finally
Application.Handle := OldAppHandle;
end;
end;
答案 2 :(得分:0)
刚刚找到它不起作用的原因。正如TOndrej所述,TAdvOfficeHint
挂钩Application.OnShowHint
并在内部执行以下代码行:
FHintInfo.Assign (AHintInfo);
Assign
内部使用动态类型检查
if (Source is TAddvHintInfo) then ...
由于DLL和主应用程序的单独类型注册表而失败。
我已经遇到过这个问题几次了,也许我真的不得不切换到运行时包以避免所有这些。
无论如何,如果我有什么办法可以防止这种情况发生,请发表评论。
答案 3 :(得分:0)
我想在Delphi 2006及更高版本中,您可以在EXE代码中调用System.ShareMemoryManager方法,以便其内存管理器与进程内存空间中加载的其他模块共享。