1

MFCDLLを介して拡張機能を提供したVB6アプリケーションがあります。ただし、DLLのCDialogベースのクラスには特定の問題があります。Me.hWndVB6アプリのメインフォームから渡して、CDialogコンストラクターに渡し、そのDoModal()親が何であるかを認識します。CDialogベースのクラスは上のVB6アプリの上にとどまりますが、モーダルダイアログで期待される方法でVB6アプリをブロックDoModal()しません。つまり、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 に答える