2011-06-30 47 views
0

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 
+0

'CreateIndirect'はモードレスダイアログのためだと思いますか?あなたは 'DoModal'を呼び出す前に' InitModalIndirect'をしたいと思うかもしれませんが、あなたのコードを表示すると便利です。この問題は、MFCデバッグアサートでは発生しませんが、アサートが失敗する原因となる使用上のバグです。 – AJG85

+0

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シナリオ) –

答えて

1

チェック。

すべてのモジュールには、CWinAppオブジェクトが1つだけ必要です。通常、CWinAppオブジェクトは、モジュールがロードおよびアンロードされたときに作成および破棄されるようにグローバル変数になります。

関連する問題