Windows中的变量类型

Ita*_*iwa 1 c++ windows winapi

只要存在不同大小的不同变量类型,为什么windows使用宏和移位运算符将2个值映射到一个变量中,例如:

这是win32 windows程序的示例:

//...
case WM_COMMAND:
{
    switch(LOWORD(wParam))
    {
        case IDC_LISTBOX:
        {
            switch(HIWORD(wParam))
            {
                //handle message
            }
        }
        break;
    }
}
break;
Run Code Online (Sandbox Code Playgroud)

简单地说为什么windows不使用两个类型的短变量?或者这有特权吗?

感谢你们

Rem*_*eau 5

窗口消息只能传递2个整数(wParamlParam参数).

整数值本身不需要跨模块/进程边界进行任何特殊编组,它们可以按原样传递.它们也非常小,可以存储在消息队列中等等.

对于WM_COMMAND特别是,lParam可以含有HWND的值,因此其它消息值(通知代码和标识符)只能在被传递wParam只.它们足够小,可以wParam直接填入,因此可以轻松传递3个值,只允许2个值.

替代方法需要为包含单独整数的结构分配内存,然后在其中一个消息参数中传递指向该结构的指针.许多窗口消息正是这样做的,但通常只有当发送方和接收方处于同一个进程中时,否则它需要跨模块/进程边界封送结构数据,这对于简单消息传递来说是很多开销.

它还使接收器的负担释放分配的内存,因为WM_COMMAND是通过接收窗口的消息队列的发布消息.发件人不等待处理消息,因此在发布消息后将无法释放结构内存.分配的内存必须在内存中保持活动状态,直到消息最终由接收窗口过程处理.

另一方面,发送的消息直接进入窗口过程并阻止发送方直到处理,因此他们不必担心这一点,发送方可以在发送消息后释放内存.但是,制作所有多值消息,特别是状态消息,这将是系统的一大瓶颈.

通常,尽可能将较短的整数填充为更大的整数更容易且开销更少,尤其是在发布的消息中(尽管发送的消息当然也可以这样做).