【问题标题】:How MAKEINTRESOURCE and WM_NOTIFY works?MAKEINTRESOURCE 和 WM_NOTIFY 是如何工作的?
【发布时间】:2012-06-25 08:22:56
【问题描述】:

大家好, 我对我们使用的一些 Win32 API 数据类型和宏有些困惑:

首先-: 关于 WM_NOTIFY 消息。 lparam 包含指向 NMHDR 结构的指针。因此,如果它是一个指针,为什么像这样访问 NMHDR 结构是非法的-:

(*lparam)->idFrom

我的意思是,如果它是一个指针,那么我可以使用间接运算符来访问该结构。 LPARAM 本身是从 LONG_PTR 类型定义的。为什么一定要这样写代码-:

((LPNMHDR)lparam)->idFrom

什么是 LPNMHDR? LPNMHDR 的类型定义如下:

typedef NMHDR FAR * LPNMHDR;

FAR* 再次以下列方式定义-:

#define FAR _far

什么是 _far 以及为什么我必须使用 LPNMHDR cast 来从 LPARAM 访问 NMHDR 结构?

其次-: MAKEINTRESOURCE 宏有什么作用?我看到很多作者在为函数指定资源时使用纯字符串。例如-:

CreateDialog(hInst,"Dialog Box",
                hwnd,(DLGPROC)DialogFunc);

但在现代编译器中,我们使用-:

CreateDialog(hInst,MAKEINTRESOURCE(DIALOG_BOX),
                hwnd,(DLGPROC)DialogFunc);

我知道如果我们在资源文件中使用字符串标识符而不是数字,那么我们可以省略这个宏,这个宏也可以将数字转换为字符串。例如,它会将 23 转换为“23”吗?因为如果它这样做了,那么我将能够使用 -:

CreateDialog(hInst,"23",
                hwnd,(DLGPROC)DialogFunc);

如果我的对话框资源是用 23 定义的。但这不起作用。

所以我想知道这个宏处理标识符后的结果是什么?它是如何工作的?我必须做什么才能在消息框中打印 MAKEINTRESOURCE 的值,因为我在使用 sprintf 函数将值复制到字符串时遇到问题。但我知道 MAKEINTRESOURCE 输出一个 LPSTR,因为它是通过以下方式定义的:

#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))

我还没有找到任何关于这个宏如何工作的文档。 msdn 声明 MAKEINTRESOURCE 是一个宏,它“将整数值转换为与资源管理功能兼容的资源类型”。 谢谢。

【问题讨论】:

标签: c++ windows winapi visual-c++


【解决方案1】:

lParam 不是指针,它是一个整数类型参数,所以你必须在使用它之前将它转换为正确的指针类型。

LPNMHDR 只是一个用于历史原因的 typedef。您也可以使用NMHDR*。 FAR 和 _far 限定符用于 16 位 Windows,只是当时留下的噪音。

MAKEINTRESOURCE 是 Windows C 语言接口使用的一个技巧,用于模拟 C++ 中重载函数的作用。这样,您可以使用指针(指向字符串)参数或整数参数调用CreateDialog。这使用了字符串永远不会分配在非常低的地址的知识,因此这些可以保留为资源 ID 的别名。一个相当丑陋的黑客!

【讨论】:

  • 我想知道 MAKEINTRESOURCE 对我发送给它的整数参数做了什么。它如何将其转换为字符串?而且我不明白在更高的地址空间分配字符串与资源 ID 有什么关系。
  • 整数只是转换为指针,而不是字符串传递。接收函数查看指针,并将指向低地址的指针转换回资源 ID。这假设 ID 的范围和实际指针不重叠。
  • @Sreyan: "返回值是低位字的指定值,高位字的零"
  • @Bo Persson 非常感谢。我有这个疑问很久了。但是你能告诉我函数如何理解是使用指针作为字符串还是使用低位字节作为资源 id。我的意思是如何通过 C 代码检测到这一点???
  • @Sreyan 0x... 是 C++ 中的十六进制数。 ptr & 0xFFFF0000 == 0 只是测试在 ptr 的高 16 位中是否设置了 NO 位,这使其成为资源 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 2013-03-05
  • 1970-01-01
  • 2018-11-10
  • 2018-02-12
相关资源
最近更新 更多