Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / DLL и диалог / 7 сообщений из 7, страница 1 из 1
28.04.2006, 10:44
    #33696543
DubAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
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();
появляется данное сообщение.
Прошу подсказать, как с этим можно справиться?
...
Рейтинг: 0 / 0
28.04.2006, 11:02
    #33696642
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL и диалог
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
28.04.2006, 11:09
    #33696669
dddddd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL и диалог
создаешь в проекте 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
28.04.2006, 13:55
    #33697404
DubAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL и диалог
По поводу обоих ответов:
насколько я понял в обоих вариантах требуется изменение исходного кода исполняющей программы, а в моем случае это невозможно, т.к. у меня только exeшник этой программы.
Нет ли других вариантов?
...
Рейтинг: 0 / 0
02.05.2006, 09:54
    #33700899
DubAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL и диалог
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
02.05.2006, 14:36
    #33701821
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL и диалог
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
02.05.2006, 18:46
    #33702518
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL и диалог
kolobok0сохранить старый хэндлер модуля.Кстати, handle можно переводить как рукоятка ... иногда смешно получается - великий, понимаешь, аглицкий, да еще перелаженный на еще более великий русский .... :)
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / DLL и диалог / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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