Невозможно создать модальный диалог из MFC DLL - PullRequest
0 голосов
/ 30 июня 2011

Я пытаюсь запустить модальное диалоговое окно из библиотеки 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

1 Ответ

1 голос
/ 15 марта 2012

Убедитесь, что вы действительно создали CWinApp где-то в вашем текущем модуле (DLL / EXE).

Каждый модуль должен иметь один и только один объект CWinApp. Обычно вы делаете объект CWinApp глобальной переменной, так что он создается и уничтожается, когда модуль загружается и выгружается соответственно.

...