当我调用 DialogBox() 时没有任何反应

问题描述 投票:0回答:1

我有一个古老的 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
中“对话框”的名称,它是项目中的文件之一。但有一些奇怪的事情:

  1. 当我修改

    IDD_DIALOG1
    中的对话框时,调用代码(包含上述行的文件)不会重新编译。但也许对话框更改不需要重新编译,它们只是在运行时调用?

  2. 如果我将

    IDD_DIALOG1
    更改为其他字符串(如“foobar”),运行时行为是一样的 - 什么也没有发生。因此,显然,此时的失败不会导致运行时错误。

我已经在网上寻找使用

DialogBox()
的代码示例,或者只是展示如何手动创建
lpTemplate
,但我能找到的唯一的就是 C++,而且我真的不想转换这个旧的-将 C 代码样式转换为 C++ 只是为了让此对话框正常工作。对于我来说,如何将 C++ 指令转换为相应的 C 指令并不明显。

我为此使用 Visual Studio 2022,一种可能性是

MenuBox.rct
文件实际上并不是项目的一部分 - 它在“解决方案资源管理器”中的项目名称下列为文件,但也许还有其他内容我需要在代码本身中做一些事情来链接它?

同样,我有一个旧的

resource.rc
文件可以用作对话框的模板,它列在“解决方案资源管理器”中,但对该文件的编辑不会导致重新编译,所以我再次'我不确定这是否真的是该项目的一部分。

底线:如何在 C 中创建和调用实际的

lpTemplate
,以及在 C 代码中“include”它(如果这是正确的词)的正确方法是什么?

c winapi dialog
1个回答
0
投票

我的错误:我的resource.rc 文件显示在“解决方案资源管理器”的“EXE”标题下,但不在“解决方案项”下。一旦我把它放在那里,我就可以从我的可执行文件中引用内容(DIALOGEX)。

我猜我也可以通过将其父文件(MenuBox.rct 文件)放在“解决方案项目”下来引用 IDD_DIALOG1,尽管我还没有尝试过。

不,我不太明白这个“解决方案资源管理器”的东西,也不明白什么去哪里。恐怕我会怀念旧的 makefile 方式...有时这些 IDE 只会让生活变得更加困难,尤其是对于我们这些老家伙来说。

感谢所有看过这篇文章的人。

© www.soinside.com 2019 - 2024. All rights reserved.