Отображение DialogBox и MessageBox из DLL

Я занят игровым движком DirectX10, и у меня проблема, которая не имеет ничего общего с DirectX :P Проблема в том, что в DLL, которая содержит движок, иногда вызывается диалоговое окно, как в обычном win32. . С той лишь разницей, что вместо HINSTANCE я использую HMODULE, который я получаю при загрузке DLL.

Кажется, все работает нормально, если я пройдусь по своему коду с помощью F10 (Visual C++ 2008), я даже увижу, как он проходит через мою функцию DlgMessageProc и делает все, что должен делать. Единственная странная вещь заключается в том, что диалоговое окно не отображается и что внезапно оно выпрыгивает из цикла сообщений и просто продолжается с остальной частью кода ???

Как ни странно, у меня та же проблема при вызове MessageBox из моей DLL, я не получаю ошибок, все работает нормально, но окно не отображается, и код не останавливается (как обычно с окнами сообщений)

Самое смешное, что у меня есть код из книги, который использует ту же базовую архитектуру, что и я, и если я скомпилирую, все будет нормально?

Итак, мой вопрос, есть ли какая-либо скрытая опция, комментарий прагмы или что-то еще, на что я должен обратить внимание, если я хочу иметь возможность показывать MessageBoxes и диалоги из моей Dll?


person Rik Nauta    schedule 05.09.2009    source источник


Ответы (2)


Нет, как я и думал, изменение манифеста совсем не помогает. Я также создал отдельный проект, в котором я просто тестирую диалог и его функцию proc, и там все работает идеально (ссылки на .exe вместо dll)

person Rik Nauta    schedule 05.09.2009

На странице свойств редактора ресурсов визуальной студии для диалогового ресурса должна быть опция, в которой вы можете указать - "No Fail Create: True".

Обычно диалоги не создаются из-за невозможности создания общего элемента управления — обычно из-за того, что InitCommonControlsEx не был вызван. Установка флажка No Fail Create позволяет увидеть диалоговое окно и определить, какие элементы управления отсутствуют.


Что еще нужно проверить:

  • Есть ли в окне отладки сообщение об исключении первого шанса? Возможно, это «выпрыгивает» из-за исключения, которое перехватывается и незаметно обрабатывается Win32. Включите отладку первых исключений win32 в диалоговом окне исключений Dev Studio, чтобы отследить их.

    Даже это не объясняет, почему вызов MessageBox не может создать окно сообщения.

  • Единственный раз, когда я видел, что MessageBox не работает, это когда:

    1. Resource leaks had made the process run out of available user32 handles - have you checked your apps handle counts using task manager?
    2. система находилась в процессе отключения. Вы вызывали PostQuitMessage, а затем пытались создать диалог/MessageBox?
person Chris Becke    schedule 05.09.2009
comment
Нет, извините, это не работает. Кстати, я вызвал InitCommonControlls и изменил свой манифест, чтобы получить кнопки в стиле XP/VISTA, может ли это повлиять на что-нибудь? Еще одна загадка: почему у меня такая же проблема с MessageBox? Они должны полностью обрабатываться Windows. У меня такое чувство, что мне нужно связать что-то дополнительное или установить параметр командной строки, но я понятия не имею. Я попытаюсь посмотреть, смогу ли я перестроить свое решение без скорректированного манифеста, но я не думаю, что это сильно поможет. - person Rik Nauta; 05.09.2009
comment
Я перезапустил свою систему и запустил решение, но ничего не произошло. Затем я добавил окно сообщений в статическую библиотеку, которая также называется, и обнаружил, что проблема еще хуже. У меня есть эта статическая библиотека, которая должна функционировать, создавать устройство и выпускать устройство, и если я помещаю туда окно сообщения, тоже ничего не происходит. Если я помещу окно сообщения в основную часть исполняемого файла, который ссылается на .lib, появится обычное окно сообщения. Так что с моей системой все в порядке!!!!! Я также не нашел никаких ошибок или предупреждений в окне вывода отладки. - person Rik Nauta; 06.09.2009