微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解MAKEINTRESOURCEW定义

看着Windows SDK,我发现这个MAKINTRESOURCEW的#define指令:

#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))

有人能向我解释那是什么意思? 例如,MAKEINTRESOURCEW(0)的值是多less? (1)? (-1)?

根据.config分割Linux内核源代码

我可以在预处理器和编译器之间挤压我自己的程序吗?

我怎样才能将一个#definedstring插入到system()命令中? (win32)中

我怎样才能得到一个文件中使用(或定义)的所有预处理符号的列表?

Microsoft编译器下_rdrand_step内在函数的可用性?

这个宏的结果是指向长字符串的值,其值等于给定的参数。 您可以通过阅读预编译器输出来查看它(请参阅/ P C ++编译器选项)。 当需要LP [w] WSTR指针时,所有的转换都需要编译这个宏结果,在Win32和x64配置中都是如此。

某些Windows API(如LoadIcon)期望字符串指针作为其参数。 可能这些函数测试指针的值,如果小于某个最大值,则将其解释为资源索引,而不是字符串(难看的C风格接口的问题)。 所以,这个宏允许通过WORD作为字符串,而不改变它的值,适当的铸造。

大多数情况下,它保持不变的值,但将其从int转换为指针,因此可以接受希望看到指针的函数。 中间转换将输入int扩大为与指针相同的大小,同时确保不会扩展符号。 如果你在意, ULONG_PTR 并不像你猜测的那样是一个“长指针”,相反,它是一个长度与指针相同的无符号长ULONG_PTR 。 在64位编程成为关注之前,其定义如下所示:

#define MAKEINTRESOURCE(i) (LPTSTR) ((DWORD) ((WORD) (i)))

现在,他们使用ULONG_PTR,这是一个32位无符号长的32位目标,64位无符号长的64位目标。

这是一个宏,它将一个参数转换为一个单词,然后将该结果转换为一个指向无符号long的指针,然后再转换为一个指向宽字符串的长指针。

像其他用户说的那样 – 它只是将一个整数转换为“指向字符串的指针”。

原因如下:在Windows 3.0的远古时代,人们尽可能地尽量简约。 假定可执行文件中的资源可以具有字符串标识符或整数。 因此,当你尝试访问这样的资源时,你指定了上面的一个,并且函数区分你的意思是自动的(通过检查提供的“指针”是否看起来像一个有效的指针)。

由于该函数无法接收“可变参数类型”,因此他们决定使其接收LPCTSTR(或类似的),而传递的实际参数可能是整数。

Windows API的另一个例子:指向窗口过程的指针。 每个窗口都有一个窗口过程(通过getwindowlong通过GWL_WNDPROC标志访问),但是有时窗口只是一个整数,指定窗口的“种类”,然后就有一个CallWindowProc来区分这些情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐