【发布时间】:2015-01-26 15:23:36
【问题描述】:
我在理解一件特定的事情时遇到了一些麻烦。 我的电脑运行的是 64 位 Windows,所以
std::cout << sizeof(HANDLE) << std::endl;
std::cout << sizeof(HWND) << std::endl;
std::cout << sizeof(int*) << std::endl;
全部打印 8,即 8 个字节(64 位)。
现在,在窗口过程中
LRESULT __stdcall wndProc(HWND, UINT, WPARAM, LPARAM lParam)
WPARAM 和 LPARAM 的大小(以字节为单位)也是 8。 然而,我记得在 Petzold 的书中读到,有些消息的窗口句柄存储在 LPARAM 参数的 LOWORD 或 HIWORD 中。 例如,
HWND childHandle = (HWND)LOWORD(lParam);
这怎么可能? lParam的HIWORD,是32位整数的前两个字节吗?为了将句柄存储在 LPARAM 中,是否需要全部 8 个字节?
谢谢!
【问题讨论】:
-
啊,谢谢,这个链接有一些很好的 cmets:msdn.microsoft.com/en-us/library/aa384203.aspx 64 位版本的 Windows 使用 32 位句柄来实现互操作性。在 32 位和 64 位应用程序之间共享句柄时,只有低 32 位有效,因此截断句柄(将其从 64 位传递到 32 位时)或对句柄进行符号扩展(将其从 32 位传递到 64 位时)。可以共享的句柄包括窗口(HWND)等用户对象的句柄、钢笔和画笔(HBRUSH 和 HPEN)等 GDI 对象的句柄,以及命名对象的句柄...