c++ - GetModuleHandle(NULL) 与 hInstance

标签 c++ winapi visual-c++

在使用 Windows API 进行编程时,我总是将 WinMain 中的 HINSTANCE 立即设为全局变量。如果我想做一个 OK 按钮,我会这样做(给定全局 HINSTANCE g_hInstance):

return CreateWindow("BUTTON", "OK", WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON, 10, 10, 100, 30, exampleParentWindow, EXAMPLECHILDID, g_hInstance, NULL);

但最近我看到实例句柄无需作为参数传递或阻塞全局命名空间就可以通过调用 GetModuleHandle(NULL)* 来确定。所以,上面的例子看起来像这样:

return CreateWindow("BUTTON", "OK", WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON, 10, 10, 100, 30, exampleParentWindow, EXAMPLECHILDID, GetModuleHandle(NULL), NULL);

*如果你的编译器支持,你可以写GetModuleHandle(nullptr),语句会得到同样的结果。

与显式指定实例句柄相比,调用 GetModuleHandle(NULL) 有什么优势(如果有)?

Fine Print:我知道这有一个答案,但在 StackOverflow 上并没有将其表述为自己的问题。

最佳答案

在 EXE 中,它没有任何区别。 WinMain() 中的 hInstanceGetModuleHandle(NULL) 都引用相同的 HINSTANCE(. exe文件)。但是,如果您在 DLL 中创建窗口,它确实会有所不同,因为您必须使用 DLL 的 hInstanceGetModuleHandle(NULL) 仍将返回 HINSTANCE 加载 DLL 的 EXE。

关于c++ - GetModuleHandle(NULL) 与 hInstance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21718027/

相关文章:

c++ - ERROR : "dependent name is not a type". 当在类中使用 typedef 类型作为返回值时,带有模板

c++ - 为什么我不能通过 std::tuple 获得保证的复制省略?

delphi - 如何在 Delphi 中使用 "Native Wifi API"Windows API 函数

c# - CreateProcessWithTokenW winapi 返回 false 但没有原因

c++ - 字符串、CString、QString 有什么区别?

c++ - fork() 与 C++ 中的 std::async

c++ - 是否可以在没有中间容器的情况下编写 STL 算法

c - C和Windows API有什么关系?

visual-c++ - MSBuild VC2012,如何确保 AfterBuild 仅在更改输出时运行?

c++ - comsupp(w).lib 在哪里?