大家好, 关于我们使用的一些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强制转换才能从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是一个宏,它'将整数值转换为与资源管理函数'兼容的资源类型。 谢谢。
答案 0 :(得分:4)
lParam
不是指针,它是一个整数类型参数,因此在使用之前必须将其强制转换为正确的指针类型。
LPNMHDR
只是用于历史原因的typedef。您也可以使用NMHDR*
。 FAR和_far限定符与16位Windows一起使用,只是从那时起留下的噪音。
MAKEINTRESOURCE
是Windows C语言接口使用的一种技巧,用于模拟重载函数在C ++中的作用。这样,您可以使用指针(字符串)参数或整数参数调用CreateDialog
。这使用了永远不会在非常低的地址分配字符串的知识,因此可以将这些字符串保留为资源ID的别名。一个相当丑陋的黑客!