静态 HWND - 为什么有必要?

Static HWND - Why is it necessary?

好吧,我问的唯一原因是因为我读到 HWND 是一个指针,指针更改原始值而不是创建存储在该内存位置的副本。

但它并不真正像指针一样,我之所以这么说是因为如果我要有一个 switch 语句,示例:

void ExampleFunction(int iSwitch)
{
    HWND hButton;

    switch (iSwitch)
    {
     case 1:
     hButton = CreateWindow( Blah Blah blah); //<-- Shouldn't it return to hButton's location.
     break;

     case 2: 
     ShowWindow(hButton, SW_SHOW); //<-- Ops forgot what was stored in hButton.
     break;
    }
}

但是作为一个新的C++ Win32程序员,不应该忘记吗?只需定位内存地址然后抓取里面的内容。除非内存地址改变等

我真的不知道会不会,你介意详细说明一下吗?谢谢。

问题中的代码缺少很多上下文(所以这里只是盲目猜测),但是如果代码在一个单独的函数中并且变量 hButton 是该函数中的局部变量,那么您必须记住,当函数在 returns 中时,局部变量会超出范围,并且下次调用该函数时,该变量是一个全新的变量,对于该调用是唯一的,并且仅对该调用是唯一的。

另外值得一提的是,非静态局部变量不会以任何方式自动初始化。如果您没有显式初始化这样一个变量,它的值将是 indeterminate 并且以任何方式使用它(除了初始化它)都会导致 未定义的行为.

This is probably not the highest quality answer; suggestions for improvement welcome.

你假设 HWND 的值永远不会改变,而 HWND 指向的 window 仍然存在,这是正确的。

我猜你写的代码是这样的:

LRESULT CALLBACK wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HWND button;

    switch (uMsg) {
    case WM_CREATE:
        button = CreateWindowEx(...);
        break;
    case WM_COMMAND:
        if (lParam == (LPARAM) button)
            /* button was clicked; do something */;
    }
    return DefWindowProc(...);
}

想知道为什么它不起作用,但改变

    HWND button;

    static HWND button;

修复它。

这不是 属性 HWND。代码失败并不是因为 HWND 的值发生了变化。其实这跟Windows一点关系都没有,全都跟C.

有关

代码不起作用的原因是每次调用 wndproc() 函数时都会重新创建 变量 button。你看,一个 window 过程被调用了很多次,在你的程序执行过程中,一个 window 收到的每条消息都会被调用一次。每次,您都会获得一个全新的 button 变量,并且 button 变量在之前调用中的值会丢失。指针仍然存在,但它没有存储在任何变量或任何其他内存位置! window 还没有被销毁。你只是无法再通过正常方式获得它。

static 所做的是告诉 C,您希望变量在每次函数调用中都保留。所以现在对您的 window 过程的每次调用都具有相同的 button,并且该指针值不再丢失。

这是一个快速解决方案,对于非常大的项目来说并不能很好地扩展。在这些情况下,包含 window 句柄、(可能)全局变量或使用 GWLP_USERDATA 或其他 cbWndExtra 字节的结构更好。我想一个更好的问题是为什么这个快速修复一直被建议作为 Stack Overflow 上其他人的类似问题的解决方案(或者至少没有解释为什么它是一个快速修复),但这是我们必须考虑的事情一个社区。

请记住,默认情况下,在大多数语言(不仅仅是 C 和 C++!)中,函数的局部变量仅在每个单独的函数调用期间存在。