静态HWND - 为什么有必要?

时间:2015-10-17 17:33:26

标签: c++ winapi static hwnd

好吧我问的唯一原因是因为我读到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程序员,不应该忘记它吗?只需找到内存地址然后抓取内部的内容即可。除非内存地址改变等。

我真的不知道会不会,你介意吗?谢谢。

2 个答案:

答案 0 :(得分:3)

  

这可能不是最高质量的答案;欢迎提出改进建议。

在HWND指向的窗口保持活动状态时,假设HWND的值永远不会改变,这是正确的。

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

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有关。

代码不起作用的原因是每次调用button函数时都会创建变量 wndproc()。请参阅,窗口过程被多次调用,对于窗口在程序执行过程中收到的每条消息,都会调用一次。每次,您都会获得一个全新的button变量,并且button变量在以前的调用中所具有的值将丢失。指针仍然存在,但它不存储在任何变量或任何其他内存位置!窗户没有被摧毁。你不能再通过正常手段去做了。

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

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

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

答案 1 :(得分:2)

问题中的代码缺少很多上下文(所以只是在这里盲目猜测),但如果代码是在一个单独的函数中而变量hButton是该函数中的局部变量,那么你有要记住,当它们所处的函数返回时局部变量超出范围,并且下次调用该函数时,该变量是一个全新的变量,对于该调用而言只有该变量是唯一的。

另外值得一提的是,非静态局部变量不会以任何方式自动初始化。如果您没有明确初始化此类变量,则其值将 indeterminate 并以任何方式使用它(初始化除外)会导致未定义的行为。< / p>