我有一个古老的 C 程序(不是 C++ 或 C#),需要调用 Win32 API
DialogBox()
函数。但是当我执行该调用时,没有任何反应 - 没有对话框,程序只是继续下一步(调用 MessageBox()
)。我不明白为什么,尽管我猜测其中一个参数是错误的 - 我只是不知道如何修复它。
我会在这里展示所有程序(如果被要求的话也会展示),但它相当冗长。相反,我将只显示失败的调用:
DialogBox(hInst,
L"IDD_DIALOG1", /*lpTemplate: name of Dialog Box Template*/
hWnd,
(DLGPROC) ControlKeyMenu);
我怀疑问题出在
lpTemplate
调用上;我使用调试器来验证其他 3 个参数在运行时是否都具有非 NULL 值。 IDD_DIALOG1
是MenuBox.rct
中“对话框”的名称,它是项目中的文件之一。但有一些奇怪的事情:
当我修改
IDD_DIALOG1
中的对话框时,调用代码(包含上述行的文件)不会重新编译。但也许对话框更改不需要重新编译,它们只是在运行时调用?
如果我将
IDD_DIALOG1
更改为其他字符串(如“foobar”),运行时行为是一样的 - 什么也没有发生。因此,显然,此时的失败不会导致运行时错误。
我已经在网上寻找使用
DialogBox()
的代码示例,或者只是展示如何手动创建 lpTemplate
,但我能找到的唯一的就是 C++,而且我真的不想转换这个旧的-将 C 代码样式转换为 C++ 只是为了让此对话框正常工作。对于我来说,如何将 C++ 指令转换为相应的 C 指令并不明显。
我为此使用 Visual Studio 2022,一种可能性是
MenuBox.rct
文件实际上并不是项目的一部分 - 它在“解决方案资源管理器”中的项目名称下列为文件,但也许还有其他内容我需要在代码本身中做一些事情来链接它?
同样,我有一个旧的
resource.rc
文件可以用作对话框的模板,它列在“解决方案资源管理器”中,但对该文件的编辑不会导致重新编译,所以我再次'我不确定这是否真的是该项目的一部分。
底线:如何在 C 中创建和调用实际的
lpTemplate
,以及在 C 代码中“include”它(如果这是正确的词)的正确方法是什么?
我的错误:我的resource.rc 文件显示在“解决方案资源管理器”的“EXE”标题下,但不在“解决方案项”下。一旦我把它放在那里,我就可以从我的可执行文件中引用内容(DIALOGEX)。
我猜我也可以通过将其父文件(MenuBox.rct 文件)放在“解决方案项目”下来引用 IDD_DIALOG1,尽管我还没有尝试过。
不,我不太明白这个“解决方案资源管理器”的东西,也不明白什么去哪里。恐怕我会怀念旧的 makefile 方式...有时这些 IDE 只会让生活变得更加困难,尤其是对于我们这些老家伙来说。
感谢所有看过这篇文章的人。