关于CreateWindow中的c ++:hInstance

hInstance in CreateWindow

我使用CreateWindow创建主窗口。 WNDCLASSEX中的hInstance指定在其下注册该类的实例。 所以我需要CreateWindow函数中的hInstance来找到它。

我使用CreateWindow创建一个按钮。 现在没有用户定义的WNDCLASSEX。 按钮的WNDCLASSEX是全局的。 但是我仍然需要将hInstance传递给函数? 为什么以及正确的传递价值是什么?

在Microsoft的示例中,它是(HINSTANCE)GetWindowLong(hMainWnd, GWL_HINSTANCE),但我不知道它是什么。

如果我有任何问题,也请告诉我。

谢谢。


我在MSDN中发现了2001年的CreateWindowCreateWindowEx

HINSTANCE

Windows 95/98 / Me:[输入]处理要与窗口关联的模块的实例。

Windows NT / 2000 / XP:此值将被忽略。


But I still need to pass an hInstance to the function? Why and what is the right value to pass?

至于为什么,(如果从winapi的角度来看),要创建一个完整的新函数,将所有内容都包含在内,而在所有其他参数仍然可用的情况下,仅使用父级或其他函数,这将是毫无意义的。

我个人不确定要传入的正确值是什么,但是我使用了GetModuleHandle(nullptr),它应该等效于传入WinMain的实例。如果这是您用来创建父窗口的方式,那么它也将与Microsoft的示例(获取用于创建父窗口的实例)的示例相同。如果使用其他应用程序的窗口作为父窗口,则会出现差异。我看到使用的另一个主要选项是nullptr / NULL,每次我使用它时,其工作方式都与上述选项相同。

我想知道,如果今天在使用NULL和应用程序的HINSTANCE之间存在细微的差别,但是这两种方法都应该可以在Windows上创建子控件。


创建窗口时,可以指定在CreateWindow的第一个参数中使用字符串(lpClassName)创建实例的类。

如果引用的多个DLL包含一个具有相同名称的类,则使用HINSTANCE进行标识。

有关更多信息,请参见https://devblogs.microsoft.com/oldnewthing/20050418-59/?p=35873