Dll и диалог
Вроде бы все правильно. Но когда пытаюсь вызвать его с помощью функции DoModal() вылетает окно с сообщением "Debug Assertion Failed" и указывается файл afxwin1.inl строка 22. Если использовать трассировку, то после входа в функцию DoModal() и при выполнении строки:
HINSTANCE hInst = AfxGetResourceHandle();
появляется данное сообщение.
Прошу подсказать, как с этим можно справиться?
Есть проект, в результате компилирования которого формируется DLL...
... Но когда пытаюсь вызвать его с помощью функции DoModal() вылетает окно с сообщением "Debug Assertion Failed" и указывается файл afxwin1.inl строка 22.
Я пробовал использовать
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
но результат прежний. И вообще, при трассировке эта строчка игнорируется, просто перескакиваем через нее и все.
В MSDN говорится, что AFX_MANAGE_STATE нужно использовать для экспортируемых функции( если я правильно понял). У меня таких функций нет. Может из-за этого строка
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
игнорируется при трассировке?
P.S. У меня есть DLL, в которой описан диалог, и в этой же DLL он и вызывается.
Я пробовал использовать
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
но результат прежний. И вообще, при трассировке эта строчка игнорируется, просто перескакиваем через нее и все.
В MSDN говорится, что AFX_MANAGE_STATE нужно использовать для экспортируемых функции( если я правильно понял). У меня таких функций нет. Может из-за этого строка
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
игнорируется при трассировке?
P.S. У меня есть DLL, в которой описан диалог, и в этой же DLL он и вызывается.
Тоже была проблема с этим. Я ее решил на этапе создания DLL. Я создавал ее в Wizard'е и выбрал "MFC extension DLL" - это помогло. Там что-то с ресурсом творилось не помню точно что...
Есть проект, в результате компилирования которого формируется DLL. В ней размещаю диалог: в проект добавляю файл ресурсов (Project->Add to project->New->Resource Script), создаю ресурс диалога (Insert->Dialog), вызываю classWizard (Ctrl+W), далее в качестве источника указываю файл с расширением rc, создаю новый класс.
Вроде бы все правильно. Но когда пытаюсь вызвать его с помощью функции DoModal() вылетает окно с сообщением "Debug Assertion Failed" и указывается файл afxwin1.inl строка 22. Если использовать трассировку, то после входа в функцию DoModal() и при выполнении строки:
HINSTANCE hInst = AfxGetResourceHandle();
появляется данное сообщение.
Прошу подсказать, как с этим можно справиться?
Перед созданием диалога пишем AfxSetResourceHandle(GetModuleHandle(szLibName)) либо AfxSetResuorceHandle(hModule), hModule получаем из DllMain.
Проблема в том, что для загрузки ресурса у тебя использовался HINSTANCE приложения, из которого вызывается конструктор класса диалога, вместо HMODULE твоей dll.
HRSRC hRes = FindResource(hLib, MAKEINTRESOURCE(IDD_SETUP_DLG), RT_DIALOG);
HGLOBAL hLRes = LoadResource(hLib, hRes);
CSetupDlg dlg;
err = dlg.InitModalIndirect(hLRes);
CSetupDlg должен иметь 2(!!) конструктора CSetupDlg();CSetupDlg(CWnd* pParent);
По умолчанию создается только 1 - CSetupDlg(CWnd* pParent = NULL);
CSetupDlg::CSetupDlg()
{
}
CSetupDlg::CSetupDlg(CWnd* pParent)
:CDialog(IDD, pParent)
{
}