创建窗口中的 hInstance
Posted
技术标签:
【中文标题】创建窗口中的 hInstance【英文标题】:hInstance in CreateWindow 【发布时间】:2013-03-17 14:47:46 【问题描述】:我使用CreateWindow
创建主窗口。 hInstance
中的WNDCLASSEX
指定了注册该类的实例。所以我需要 hInstance
在 CreateWindow
函数中找到它。
我使用CreateWindow
创建一个按钮。现在没有用户定义的WNDCLASSEX
。 BUTTON 的WNDCLASSEX
是全球性的。但是我仍然需要将hInstance
传递给函数?为什么以及传递的正确值是什么?
在微软的例子中是(HINSTANCE)GetWindowLong(hMainWnd, GWL_HINSTANCE)
,但我不知道它是什么。
如果我有什么问题也请告诉我。
谢谢。
【问题讨论】:
我看到的仅有的两个HINSTANCE
值是nullptr
(或NULL
)和GetModuleHandle(nullptr)
(或传递给WinMain
的任何值)。老实说,我从来没有见过我能回忆起两者在类注册或窗口创建中的区别,所以我总是使用后者,它总是能正常工作。
@chris: GetModuleHandle
将返回 HMODULE
而不是 HINSTANCE
,它们是否相同?
是的,在 16 位 Windows 中存在差异,但现在它们是相同的。见:Raymond Chen's Article
@nabroyan,因此,每当用户尝试与 Windows Government 内的任何程序窗口进行交互时,Windows O/S 都会首先拦截该通信。 无价。
@Immueggpain,当然,但从文章中窃取:在设计 Win32 时,出现了一个问题,“我们如何处理 Win32 的 HINSTANCE 和 HMODULE?”由于程序在单独的地址空间中运行,因此您没有跨进程边界可见的实例句柄。所以设计者拿走了他们唯一拥有的东西:模块的基地址。这类似于 HMODULE,因为文件头描述了文件的内容及其结构。而且它也类似于HINSTANCE,因为数据保存在数据段中,直接映射到进程中。
【参考方案1】:
我在 2001 年的 MSDN 中发现 CreateWindow
和 CreateWindowEx
hInstance
Windows 95/98/Me: [in] 要与窗口关联的模块实例的句柄。
Windows NT/2000/XP:此值被忽略。
【讨论】:
【参考方案2】:但我仍然需要将 hInstance 传递给函数吗?为什么以及传递的正确值是什么?
至于为什么,创建一个全新的函数来获取除此之外的所有内容并在所有其他参数仍然有用时仅使用父级或其他内容会有点毫无意义(至少从 winapi 的角度来看)。
我个人并不确定传入的正确值是什么,但我使用GetModuleHandle(nullptr)
,它应该相当于传入WinMain
的实例。如果您使用它来创建父窗口,它也将与 Microsoft 的示例使用的示例(获取用于创建父窗口的实例)相同。如果使用不同的应用程序的窗口作为父窗口,就会出现差异。我看到使用的另一个主要选项是nullptr
/NULL
,每次我使用它时,它的工作方式都与上述选项相同。
如果今天使用 NULL
和应用程序的 HINSTANCE
之间存在细微差别,我想知道,但其中任何一个都可以很好地在您的窗口上创建子控件。
【讨论】:
【参考方案3】:创建窗口时,在CreateWindow
的第一个参数中用字符串(lpClassName
)指定创建实例的类。
hInstance
用于在引用的多个 DLL 包含同名类的情况下进行标识。
欲了解更多信息,请参阅https://devblogs.microsoft.com/oldnewthing/20050418-59/?p=35873
【讨论】:
以上是关于创建窗口中的 hInstance的主要内容,如果未能解决你的问题,请参考以下文章