我们有一个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的其他地方,并按预期工作。
一个简单的解决方案可能是在调用DLL之前禁用VB6代码中的父VB6应用程序,当DLL代码返回时重新启用VB6应用程序。类似于(air code)
Me.Enabled = False
MagicDLL.ShowTheDialog(Me.hWnd)
Me.Enabled = True