|
|
|
DLL и диалог
|
|||
|---|---|---|---|
|
#18+
Есть проект, в результате компилирования которого формируется 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(); появляется данное сообщение. Прошу подсказать, как с этим можно справиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 10:44 |
|
||
|
DLL и диалог
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 11:02 |
|
||
|
DLL и диалог
|
|||
|---|---|---|---|
|
#18+
создаешь в проекте 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(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 11:09 |
|
||
|
DLL и диалог
|
|||
|---|---|---|---|
|
#18+
По поводу обоих ответов: насколько я понял в обоих вариантах требуется изменение исходного кода исполняющей программы, а в моем случае это невозможно, т.к. у меня только exeшник этой программы. Нет ли других вариантов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 13:55 |
|
||
|
DLL и диалог
|
|||
|---|---|---|---|
|
#18+
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 он и вызывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 09:54 |
|
||
|
DLL и диалог
|
|||
|---|---|---|---|
|
#18+
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. с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 14:36 |
|
||
|
DLL и диалог
|
|||
|---|---|---|---|
|
#18+
kolobok0сохранить старый хэндлер модуля.Кстати, handle можно переводить как рукоятка ... иногда смешно получается - великий, понимаешь, аглицкий, да еще перелаженный на еще более великий русский .... :) Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 18:46 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=357&tid=2031387]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 383ms |

| 0 / 0 |
