1

我正在使用 DirectX10 游戏引擎,但遇到了与 DirectX 无关的问题:P 问题是在包含引擎的 DLL 中,有时会调用 DialogBox,就像您在普通 win32 中所做的那样. 唯一的区别是我使用加载 DLL 时得到的 HMODULE 而不是 HINSTANCE。

一切似乎都运行良好,如果我使用 F10 (Visual C++ 2008) 单步执行我的代码,我什至可以看到它正在通过我的 DlgMessageProc 函数并执行它应该执行的所有操作。唯一奇怪的是没有显示任何对话框,并且突然间它跳出消息循环并继续执行其余代码???

奇怪的是,从我的 DLL 中调用 MessageBox 时我遇到了同样的问题,我没有收到任何错误,一切似乎都工作正常,但没有显示窗口,代码也没有停止(与消息框一样正常)

有趣的是,我有一本书的一些代码与我使用相同的基本架构,如果我编译一切都很好?

所以我的问题是,如果我希望能够从我的 Dll 中显示 MessageBoxes 和 Dialogs,是否有任何隐藏选项、pragama 注释或其他我应该看的东西?

4

2 回答 2

0

在对话框资源的 Visual Studio 资源编辑器的属性页中,应该有一个选项,您可以在其中指定 - “No Fail Create: True”。

通常对话框无法创建是因为无法创建公共控件 - 通常是因为尚未调用 InitCommonControlsEx。设置 No Fail Create 标志可让您查看对话框并确定缺少哪些控件。


其他要检查的事项:

  • 调试窗口中是否有关于第一次机会异常的消息?也许它“跳出”是因为 Win32 正在捕获并静默处理一个异常。在 Dev Studio 异常对话框中打开第一次机会 win32 异常的调试以跟踪该异常。

    即使这样也无法解释 MessageBox 调用如何无法创建消息框。

  • 我见过 MessageBox 无法工作的唯一时间是:

    1. 资源泄漏导致进程用尽了可用的 user32 句柄 - 您是否使用任务管理器检查过您的应用程序句柄计数?
    2. 系统正在关闭。您是否调用了 PostQuitMessage,然后尝试创建一个对话框/消息框?
于 2009-09-05T17:39:43.937 回答
0

不,正如我想的那样,改变清单根本没有帮助。我还创建了一个单独的项目,我只是在其中测试对话框及其 proc 函数,并且一切正常(链接到 .exe 而不是 dll)

于 2009-09-05T17:51:46.660 回答