MFCアプリケーションによって読み込まれたDLLからモーダルダイアログを起動しようとしています。私はVS2010を使用しており、EXEとDLLの両方はスタティックライブラリでMFCを使用します。MFC DLLからモーダルダイアログを作成できません
私のDLLでDoModal()
を呼び出すと、ダイアログが表示され、親はCWnd *がMFCアプリケーションのメインウィンドウを指しています。ダイアログリソースはDLL内にあります。
これは最終的にこのデバッグチェックを持つMFCライブラリ関数CWnd::CreateDlgIndirect
、につながる:
#ifdef _DEBUG
if (AfxGetApp()->IsKindOf(RUNTIME_CLASS(COleControlModule)))
{
TRACE(traceAppMsg, 0, "Warning: Creating dialog from within a COleControlModule application is not a supported scenario.\n");
}
#endif
AfxGetApp()
戻りので、チェックが失敗したデバッグのコードをNULL。リリースでコンパイルすると、ダイアログが表示されますが、動作していないようです(デフォルトを設定していてもすべてのフィールドが空ですが、一部のボタンは表示されません)。
ダイアログを起動する関数の先頭にAFX_MANAGE_STATE(AfxGetStaticModuleState());
を追加しようとしましたが、それは何の違いもありません。
私には何が欠けていますか?
編集:私はダイアログを呼び出すために使用するコードです。あなたが実際にあなたの現在のモジュール(DLL/EXE)のどこかのCWinAppを作成しました
HMODULE oldResMod = AfxGetResourceHandle();
AFX_MANAGE_STATE(AfxGetStaticModuleState());
AfxSetResourceHandle(GetThisModule());
CWnd wndParent;
wndParent.Attach(parent);
CExportOptionsDlg dlg(&wndParent);
dlg.project_name = project->GetName();
if (dlg.DoModal() != IDOK)
{
wndParent.Detach();
AfxSetResourceHandle(oldResMod);
return false; // cancelled
}
// ... (get some data from the dialog members) ...
wndParent.Detach();
AfxSetResourceHandle(oldResMod);
return true; // OK
'CreateIndirect'はモードレスダイアログのためだと思いますか?あなたは 'DoModal'を呼び出す前に' InitModalIndirect'をしたいと思うかもしれませんが、あなたのコードを表示すると便利です。この問題は、MFCデバッグアサートでは発生しませんが、アサートが失敗する原因となる使用上のバグです。 – AJG85
Pat Brenner(MSのsnr MFCエンジニア)のコメント[here ...](http://connect.microsoft.com/VisualStudio/feedback/details/376123/warning-creating-dialog-from-within)を読むことをお勧めします。 -a-colecontrolmodule-application-not-a-supportedシナリオ) –