【问题标题】:VB6 Host with MFC DLL Showing Modal Dialog Incorrectly带有 MFC DLL 的 VB6 主机错误地显示模态对话框
【发布时间】:2012-12-15 15:09:39
【问题描述】:

我们有一个 VB6 应用程序,我们通过 MFC DLL 提供了扩展功能。但是,DLL 中基于 CDialog 的类存在一个特定问题。我们从 VB6 应用程序的主窗体传入 Me.hWnd 以提供给 CDialog 构造函数,以便 DoModal() 知道它的父级是什么。尽管基于 CDialog 的类在 DoModal() 上位于 VB6 应用程序的顶部,但它们不会像模式对话框所期望的那样阻止 VB6 应用程序。也就是说,当 DLL 对话框仍然在 EXE 的窗口前面时,我仍然可以单击调用 DLL 的按钮,再次(一次又一次)显示该对话框。

VB6 代码没有什么可显示的。正如我提到的,它只是通过Me.hWnd。 MFC代码很简单:

HWND exeHwnd = pSessionContext->GetHWnd(); // our state container for the DLL
CWnd* exeWnd = CWnd::FromHandle(exeHwnd);
MyCDialog dlg(exeWnd);
INT_PTR result = dlg.DoModal();
// waits, stays in front, but does not "block" the window
switch (result) // ...

我沿途跟踪了这些值,并使用 Spy++ 确认了窗口句柄。一切似乎都很好。任何想法我错过了什么或做错了什么?

附加信息

该 hwnd 值在 MessageBox 的其他地方使用并按预期工作。

【问题讨论】:

  • pSessionContext->GetHWnd 返回 VB6 的 Me.hWnd?

标签: mfc vb6 modal-dialog cdialog


【解决方案1】:

一个简单的解决方案可能是在调用 DLL 之前在 VB6 代码中禁用父 VB6 应用程序,并在 DLL 代码返回时重新启用 VB6 应用程序。像这样的东西(空气代码)

Me.Enabled = False 
MagicDLL.ShowTheDialog(Me.hWnd)
Me.Enabled = True 

【讨论】:

  • 虽然由于失去焦点,窗口突出显示仍然会发生变化,但这种技术将解决主要问题。很好的解决方法。
  • 我希望有人能提出更好的解决方案! :)
  • 这简直就是 hack-tastic,但另一种解决方案是在 DLL 中创建一个虚拟父 CDialog,然后以模态方式启动真正的 CDialog。
  • 有时需要 hacktasticness 才能完成工作!另一种可能的调查途径:每个 VB6 应用程序都有一个隐藏的顶级窗口“ThunderMain”。您可以尝试通过该窗口的 hWnd 看看会发生什么。这是找到它的方法Karl Peterson article
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多