MAKEWORD、HIWORD、LOWORD 宏定义

本文详细介绍了MAKEWORD宏定义的使用方法,以及与之相关的HIWORD和LOWORD宏如何从DWORD中提取高16位和低16位的数据。这些宏在Windows编程中用于处理字节和字数据结构。

MAKEWORD 宏定义

typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef unsigned long       DWORD;
typedef unsigned long       ULONG_PTR;
typedef ULONG_PTR           DWORD_PTR;

#define MAKEWORD(a, b)      ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | ((WORD)

HIWORD、LOWORD宏定义

#define LOWORD(l)           ((WORD)((DWORD)(l)))
#define HIWORD(l)           ((WORD)(((DWORD)(l)>>16)&0xFFFF))

HIBYTE、LOBYTE、MAKELONG...

header file: declared in <windef.h>, include <windows.h>

在 Windows 编程中,`MAKEWORD` 是一个常用的宏,用于将两个 8 位的字节值组合成一个 16 位的 `WORD` 类型值。这个宏通常用于处理 Windows API 中需要版本号或 16 位标识符的场景,例如 `LOADED_IMAGE` 结构体中的某些字段,或者在 Winsock 初始化时指定版本号。 ### `MAKEWORD` 宏的定义 ```cpp #define MAKEWORD(a, b) \ ((WORD) (((BYTE) (a)) | ((WORD) ((BYTE) (b))) << 8)) ``` 该宏接受两个参数 `a` 和 `b`,分别表示低位字节和高位字节,并通过位运算将它们组合成一个 16 位的值。其中,`a` 通常表示低字节,`b` 表示高字节[^1]。 ### 示例:在 Winsock 初始化中使用 `MAKEWORD` Winsock 初始化时,需要指定使用的版本号。Winsock 2 支持版本 2.2,可以通过 `MAKEWORD(2, 2)` 来指定版本号。 ```cpp #include <winsock2.h> #include <ws2tcpip.h> #include <iostream> #pragma comment(lib, "Ws2_32.lib") int main() { WSADATA wsaData; // 使用 MAKEWORD 指定 Winsock 版本为 2.2 int result = WSAStartup(MAKEWORD(2, 2), &wsaData); if (result != 0) { std::cerr << "WSAStartup failed: " << result << std::endl; return 1; } std::cout << "Winsock initialized successfully." << std::endl; WSACleanup(); return 0; } ``` ### `MAKEWORD` 的内部机制 - `(BYTE)(a)` 将低位字节转换为 8 位无符号整数。 - `(BYTE)(b)` 将高位字节转换为 8 位无符号整数。 - `((WORD)((BYTE)(b))) << 8` 将高位字节左移 8 位,使其占据高 8 位。 - `((BYTE)(a)) | ...` 将低位字节与高位字节组合,形成一个完整的 16 位值。 ### 其他应用场景 除了 Winsock,`MAKEWORD` 还可用于其他需要 16 位值的 Windows API 函数中,例如: - 创建窗口类时指定样式 (`WNDCLASS` 结构体的 `style` 字段)。 - 处理设备上下文 (DC) 的某些属性设置。 - 在注册热键 (`RegisterHotKey`) 时指定修饰键和虚拟键码的组合。 ### 替代方法 如果不想使用 `MAKEWORD`,也可以手动组合两个字节: ```cpp WORD value = (static_cast<WORD>(high_byte) << 8) | low_byte; ``` 这种方式与 `MAKEWORD` 宏的实现逻辑一致,但代码可读性略差。 ### 总结 `MAKEWORD` 是 Windows 编程中一个非常实用的宏,尤其在需要处理 16 位值的场景中。通过将两个 8 位字节组合成一个 16 位值,可以简化代码并提高可读性。它在 Winsock 初始化、窗口类注册、热键设置等场景中均有广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值