hInstance in CreateWindow
我使用CreateWindow创建主窗口。 WNDCLASSEX中的hInstance指定在其下注册该类的实例。 所以我需要CreateWindow函数中的hInstance来找到它。
我使用CreateWindow创建一个按钮。 现在没有用户定义的WNDCLASSEX。 按钮的WNDCLASSEX是全局的。 但是我仍然需要将hInstance传递给函数? 为什么以及正确的传递价值是什么?
在Microsoft的示例中,它是(HINSTANCE)GetWindowLong(hMainWnd, GWL_HINSTANCE),但我不知道它是什么。
如果我有任何问题,也请告诉我。
谢谢。
-
我看到的仅有两个HINSTANCE值是nullptr(或NULL)和GetModuleHandle(nullptr)(或传递给WinMain的任何值)。老实说,我从未见过我可以在类注册或窗口创建中使用的两者之间的区别,因此我始终使用后者,并且始终可以正常工作。
-
@chris:GetModuleHandle将返回HMODULE而不是HINSTANCE,它们是相同的吗?
-
是的,16位Windows有所不同,但是现在它们是相同的。请参阅:Raymond Chens文章
-
@chris:但一个HMODULE可能有多个HINSTANCE。那如果在不同实例下运行时在同一NAME上注册了不同的WNDCLASS怎么办?我认为那很有可能。
-
由于程序现在在单独的地址空间中运行,因此它们都代表模块的基地址。 AFAIK,GetModuleHandle(nullptr)将为连续运行两次的同一可执行文件返回不同的物理地址。
-
可能会对您有所帮助bobobobo.wordpress.com/2008/01/31/
-
@chris:所以实际上您的意思是,不再有HMODULE,只有HINSTANCE?
-
@nabroyan,因此,每当用户尝试与该Windows Government内部的任何程序窗口进行交互时,Windows O / S便会首先进行通信。无价。
-
@Immueggpain,当然,但是从文章中窃取了:在设计Win32时,出现了一个问题:"我们如何使用HINSTANCE和HMODULE for Win32?由于程序在单独的地址空间中运行,因此您没有跨进程边界可见的实例句柄。因此,设计人员采用了他们拥有的唯一东西:模块的基址。这类似于HMODULE,因为文件头描述了文件的内容及其结构。而且它也类似于HINSTANCE,因为数据保留在数据段中,该数据段直接映射到流程中。
-
@chris,明白了。在我看来,自运行以来,HINSTANCE比HMODULE更有意义。那您能告诉我在创建控件时要传递什么正确的值吗?您知道它已经有一个hWndParent。我看到的很多示例都只使用NULL,并且效果很好。
-
NULL和GetModuleHandle(NULL)都对我来说一直很好,并且不同的教程总体上选择了这两个选项,因此我不确定哪个在技术上更好。我很想说他们在这种情况下内部都做同样的事情。
-
@chris,没关系。您可以发布答案,以便我关闭此问题吗?
我在MSDN中发现了2001年的CreateWindow和CreateWindowEx
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