大家好,
对于我们使用的某些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是一个宏,它“将整数值转换为与资源管理功能兼容的资源类型”。
谢谢。

最佳答案

lParam不是指针,它是整数类型的参数,因此在使用它之前必须将其强制转换为正确的指针类型。
LPNMHDR只是出于历史原因而使用的typedef。您也可以使用NMHDR*。 FAR和_far限定词与16位Windows一起使用,仅是那时留下的噪音。
MAKEINTRESOURCE是Windows C语言界面使用的一种技巧,用于模拟重载函数在C++中的功能。这样,您可以使用指针(指向字符串)参数或整数参数来调用CreateDialog。这利用了这样的知识,即永远不会在非常低的地址处分配字符串,因此可以保留这些字符串作为资源ID的别名。一个相当丑陋的hack!

09-06 05:45