带有MFC DLL的VB6主机错误地显示模态对话框

时间:2012-12-31 12:57:33

标签: mfc vb6 modal-dialog cdialog

我们有一个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并按预期工作。

1 个答案:

答案 0 :(得分:1)

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

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