C++ WINAPI C++;GetDlgItem未返回有效句柄

C++ WINAPI C++;GetDlgItem未返回有效句柄,c++,winapi,64-bit,C++,Winapi,64 Bit,我试图通过ID获取子窗口的句柄,但要做到这一点,我必须双重转换ID,否则它将无法工作。还有别的办法吗?我错过了什么 WINAPI x64 C++ 代码: 第一种方法在正常情况下工作正常,您应该使用: GetDlgItem(hParent, BASE_ID + i) 它在代码中失败的原因是BASE\u ID+i(aka 101)与传递给CreateWindow()的ID不同 调用CreateWindow()时,您首先将BASE_ID常量自身强制转换,然后将i添加到该指针,从而调用指针算法,最终生

我试图通过ID获取子窗口的句柄,但要做到这一点,我必须双重转换ID,否则它将无法工作。还有别的办法吗?我错过了什么

WINAPI x64 C++

代码:


第一种方法在正常情况下工作正常,您应该使用:

GetDlgItem(hParent, BASE_ID + i)
它在代码中失败的原因是
BASE\u ID+i
(aka 101)与传递给
CreateWindow()
的ID不同

调用
CreateWindow()
时,您首先将
BASE_ID
常量自身强制转换,然后将
i
添加到该指针,从而调用指针算法,最终生成的ID(32位为104,64位为108)与预期的ID(101)不同

因此,
GetDlgItem(hParent,BASE_ID+i)
无法找到匹配的ID,而
GetDlgItem(hParent,(int)((humenu)BASE_ID+i))
成功,因为它使用了调用
CreateWindow()
时使用的相同强制转换逻辑,从而找到了匹配的ID

因此编译器将
(HMENU)BASE_ID+i
解释为
((HMENU)BASE_ID)+i
。您需要修复括号,以便先执行加法,然后强制转换结果:

CreateWindow(... (HMENU)(BASE_ID + i), ...)

然后
GetDlgItem(hParent,BASE_ID+i)
将按预期工作。

您能否详细说明“这不起作用”的含义?它不编译吗?运行时错误?你的问题应该包括这些重要的细节。
CreateWindow(... (HMENU)(BASE_ID + i), ...)