1

我们有一个 VB6 应用程序,我们通过 MFC DLL 提供了扩展功能。但是,DLL 中基于 CDialog 的类存在一个特定问题。我们Me.hWnd从 VB6 应用程序的主窗体传递给 CDialog 构造函数,以便DoModal()知道它的父级是什么。尽管基于 CDialog 的类位于 VB6 应用程序的顶部DoModal(),但它们不会像模式对话框所期望的那样阻止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 并按预期工作。

4

1 回答 1

1

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

Me.Enabled = False 
MagicDLL.ShowTheDialog(Me.hWnd)
Me.Enabled = True 
于 2012-12-31T13:52:31.153 回答