了解MAKEINTRESOURCEW定义

时间:2010-06-03 06:03:12

标签: windows winapi c-preprocessor

查看Windows SDK,我发现了MAKEINTRESOURCEW的#define指令:

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

有人可以向我解释这意味着什么?例如,MAKEINTRESOURCEW(0)的值是多少? (1)? (-1)?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

在大多数情况下,它保持值不变,但是将它从int转换为指针,因此它可以接受期望看到指针的函数。中间强制转换将输入int加宽到与指针相同的大小,同时确保进行符号扩展。如果您在意,ULONG_PTR 就像您可能猜到的那样“ULONG POINTER” - 相反,它是一个与指针大小相同的无符号长度。在64位编程成为关注之前,定义类似于:

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

现在,他们使用ULONG_PTR,对于32位目标,它是32位无符号长度,对于64位目标,是64位无符号长度。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

原因如下:在Windows 3.0的古代,人们试图尽可能地简约。 假设可执行文件中的资源可以包含字符串标识符或整数。因此,当您尝试访问此类资源时 - 您可以指定上述其中一项,并且该函数会自动区分您的意思(通过检查提供的“指针”是否看起来像一个有效指针)。

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

Windows API的另一个示例:指向窗口过程的指针。每个窗口都有一个窗口过程(通过GetWindowLong访问GWL_WNDPROC标志。 然而,有时它只是一个整数,它指定窗口的“种类”。 然后有一个CallWindowProc知道区分这些情况。