Я пытаюсь запустить модальное диалоговое окно из библиотеки DLL, загруженной приложением MFC. Я использую VS2010 и как EXE, так и DLL используют MFC в статической библиотеке.
Я вызываю DoModal()
в моей DLL, чтобы запустить диалоговое окно, а родительский элемент - 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());
в начало функции, которая запускает диалог, и это не имеет никакого значения.
Чего мне не хватает?
Редактировать: вот код, который я использую для вызова диалога.
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