Delphi - DLL中的表单 - 提示未显示

时间:2010-02-17 11:41:00

标签: delphi dll

我在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组件包)。不幸的是,提示没有出现。

我在这里遗漏了什么吗?如何使表单的行为与从主应用程序中显示的表单完全相同?

谢谢!

4 个答案:

答案 0 :(得分:5)

我不知道TAdvOfficeHint但我猜它挂钩Application.OnShowHint来设置自己的THintWindowClass,即使主要可执行文件和DLL都在TMS单元中链接,他们每个人都有自己的班级副本,这是出错的地方。

分配Application是不够的:还有其他全局变量,例如ScreenMouse等。其他甚至隐藏在实现中,所以我说你有机会< 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方法,以便其内存管理器与进程内存空间中加载的其他模块共享。