4

当我单击主窗口上的按钮时,我试图创建一个弹出窗口,为此我使用了 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。

4

1 回答 1

9

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

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

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

于 2014-08-16T16:26:48.817 回答