powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / DLL и диалог
7 сообщений из 7, страница 1 из 1
DLL и диалог
    #33696543
DubAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть проект, в результате компилирования которого формируется 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();
появляется данное сообщение.
Прошу подсказать, как с этим можно справиться?
...
Рейтинг: 0 / 0
DLL и диалог
    #33696642
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DubAlexЕсть проект, в результате компилирования которого формируется 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();
появляется данное сообщение.
Прошу подсказать, как с этим можно справиться?
Как я понял, речь идет об MFC-extension DLL?
Тогда:
1) сборка DLL и использующего ее модуля (другой DLL) должны быть идентичны (т.е. только Debug, либо только Release)
2) Точно не помню,кажется в InitInstance, DLL-ки назначить hande ресурсов на DLL, т.е. примерно так:
Код: plaintext
AfxSetResourceHandle (m_hInstance);
где m_hInstance- хендл DLL (ну, и , естесственно, надо запомнить "старый" хендл ресурсов, и при выходе из DLL восстановить его:AfxSetResourceHandle (m_hPrevInstance);)
...
Рейтинг: 0 / 0
DLL и диалог
    #33696669
dddddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
создаешь в проекте dll сам диалог и его класс
пишешь функцию для его вызова
extern "C++" BOOL PASCAL EXPORT _Dialog()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
Dialog1 dlg;
dlg.DoModal();
return 0;
}
добавляешь ее в def

и вызывешь его из своей программы

HMODULE hMod = LoadLibrary("lib.dll");
typedef bool (CALLBACK* ShowDlg)();
ShowDlg sd;
sd = (ShowDlg)GetProcAddress(hMod,"_Dialog");
sd();
...
Рейтинг: 0 / 0
DLL и диалог
    #33697404
DubAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу обоих ответов:
насколько я понял в обоих вариантах требуется изменение исходного кода исполняющей программы, а в моем случае это невозможно, т.к. у меня только exeшник этой программы.
Нет ли других вариантов?
...
Рейтинг: 0 / 0
DLL и диалог
    #33700899
DubAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ddddddсоздаешь в проекте dll сам диалог и его класс
пишешь функцию для его вызова
extern "C++" BOOL PASCAL EXPORT _Dialog()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
Dialog1 dlg;
dlg.DoModal();
return 0;
}

Я пробовал использовать
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
но результат прежний. И вообще, при трассировке эта строчка игнорируется, просто перескакиваем через нее и все.
В MSDN говорится, что AFX_MANAGE_STATE нужно использовать для экспортируемых функции( если я правильно понял). У меня таких функций нет. Может из-за этого строка
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
игнорируется при трассировке?
P.S. У меня есть DLL, в которой описан диалог, из в этой же DLL он и вызывается.
...
Рейтинг: 0 / 0
DLL и диалог
    #33701821
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DubAlexЕсть проект, в результате компилирования которого формируется 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();
появляется данное сообщение.
Прошу подсказать, как с этим можно справиться?

Вам уже Alex_VC дал правильный ответ. В Вашей дэлеле в точке загрузки сделайте ЗАПОМИНАНИЕ хэндлера Вашей дэлеле. А при вызове Вашего диаложка, там где грузите ресурс сделайте взять и сохранить старый хэндлер модуля. Выставить текущий модуль Вашей дэлеле и грузить Ваш ресурс на здоровье...

Пример....

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		g_hDLLInstance = hInstance;
		g_hInst = hInstance;
..................
	}
	return  1 ;   // ok
}

BOOL LR_LoadString(UINT nID, CString& strRes)
{
	HINSTANCE hResourceHandle = AfxGetResourceHandle();
	BOOL blSwitchResource = FALSE;

	if(g_hDLLInstance != hResourceHandle)
	{
		AfxSetResourceHandle(g_hDLLInstance);
		blSwitchResource = TRUE;
	}

	try
	{
		strRes.LoadString(nID);
	}
	catch(...)
	{
		if(blSwitchResource)
		{
			AfxSetResourceHandle(hResourceHandle);
		}
		return FALSE;
	}

	if(blSwitchResource)
	{
		AfxSetResourceHandle(hResourceHandle);
	}

	return TRUE;
}


с уважением
(круглый)
...
Рейтинг: 0 / 0
DLL и диалог
    #33702518
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0сохранить старый хэндлер модуля.Кстати, handle можно переводить как рукоятка ... иногда смешно получается - великий, понимаешь, аглицкий, да еще перелаженный на еще более великий русский .... :)
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / DLL и диалог
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]