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