代码之家  ›  专栏  ›  技术社区  ›  rsthegreat12

在WinMain之外使用CreateWindowEX函数时,如何获取该函数的HINSTANCE?

  •  4
  • rsthegreat12  · 技术社区  · 12 年前

    当我单击主窗口上的按钮时,我正在尝试创建一个弹出窗口,为此我使用了CreateWindowEX函数。但是,CreateWindowEx函数接收HINSTANCE类型变量作为其最后一个参数。考虑到我是在WndProcedure内部创建这个新窗口,当单击按钮时,WinMain函数中的HINSTANCE变量将不可用,因为它不是全局变量。

    以下代码是从WndProcedure回调函数获得的:

                case IDC_BUTTON PRESSED:
                {
    
                    const char g_szClassName2[] = "POPWIND";
                    const char WndName2[] = "POPUP WINDOW";
    
                    HWND invisWindowHandle = CreateWindowEx(0,
                          g_szClassName2,
                          WndName2,
                          WS_OVERLAPPEDWINDOW,
                          200,
                          200,
                          800,
                          500,
                          NULL,
                          NULL,
                          hInstance,//THIS IS THE VARIABLE I AM HAVING TROUBLE GETTING
                          NULL);
    
                    ShowWindow(invisWindowHandle, 3);// SW_SHOWNORMAL);
                    UpdateWindow(invisWindowHandle);
                 }
    

    如何获取所需的hInstance变量,以便CreateWindowEx函数从WndProcedure回调函数内部工作?

    注意:我考虑过将hInstance变量设置为全局变量,但我不确定是否必须为应用程序创建的每个窗口使用相同的hInstance。

    1 回复  |  直到 12 年前
        1
  •  11
  •   Hans Passant    12 年前

    winapi带有从Windows版本1到3继承的一些包袱。他们使用协作式多任务,运行相同的“任务”,通过使用相同的程序并传递不同的hInstance值来实现。将多任务GUI操作系统塞进640 KB的RAM中的重要技巧。

    21年前,随着Windows NT的发布,Windows 95的发布,这一点不再适用。最初支持进程概念的Windows版本。安全性和系统稳定性的一个重要概念是,运行程序之间存在非常强的隔离。因此,HINSTANCE的相关性消失了,每个过程都获得了相同的价值。A. 伪句柄 对于HMODULE来说,这非常类似,它只是加载模块的内存中的地址。

    因此,可以为hInstance参数传递NULL。它意味着“当前进程”,不能为另一个进程创建窗口。将从WinMain()获得的hInstance存储在全局变量中也很好,只有一个。