代码之家  ›  专栏  ›  技术社区  ›  Meta

了解makeintresourcew定义

  •  3
  • Meta  · 技术社区  · 15 年前

    查看Windows SDK,我发现makeintresourcew的以下define指令:

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

    有人能给我解释一下那是什么意思吗?例如,MakeintResourceW(0)的值是多少?(1)?(1)?

    4 回复  |  直到 9 年前
        1
  •  2
  •   Alex F    15 年前

    此宏的结果将是指向值等于给定参数的长字符串的指针。可以通过读取预编译器输出(参见/p+C++编译器选项)来查看它。在win32和x64配置中,当需要lp[w]wstr指针时,需要所有强制转换来编译此宏结果。

    一些Windows API(如LoadIcon)希望字符串指针作为其参数。可能,这些函数测试指针值,如果指针值小于某个最大值,则将其解释为资源索引,而不是字符串(丑陋的C样式接口的问题)。因此,这个宏允许以字符串形式传递单词,而不更改其值,并使用适当的强制转换。

        2
  •  2
  •   Jerry Coffin    15 年前

    在大多数情况下,它保持值不变,但将其从int转换为指针,因此期望看到指针的函数可以接受它。中间强制转换将输入int扩大到与指针相同的大小,同时确保 反对 它正在延长标志。如果你在乎的话, ULONG_PTR 你可能会猜到一个“ulong指针”——相反,它是一个与指针大小相同的无符号长型指针。在64位编程成为关注点之前,定义如下:

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

    现在,他们使用ulong-ptr,32位目标的长度是32位无符号的,64位目标的长度是64位无符号的。

        3
  •  1
  •   Kevin Le - Khnle    15 年前

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

        4
  •  1
  •   valdo    15 年前

    正如其他用户所说,它只是将一个整数转换成一个“指向字符串的指针”。

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

    因为函数不能接收“变量参数类型”-他们决定让它接收lpctstr(或类似的类型),而 实际的 传递的参数可以是整数。

    WindowsAPI的另一个例子:指向窗口过程的指针。每个窗口都有一个窗口过程(通过访问 GetWindowLong 具有 GWL_WNDPROC 旗帜。 然而,有时它只是一个整数,指定窗口的类型。 然后有一个 CallWindowProc 他们知道区分这些案件。