创建窗口中的 hInstance

Posted

技术标签:

【中文标题】创建窗口中的 hInstance【英文标题】:hInstance in CreateWindow 【发布时间】:2013-03-17 14:47:46 【问题描述】:

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

我使用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 中发现 CreateWindowCreateWindowEx

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的主要内容,如果未能解决你的问题,请参考以下文章

创建“部分”窗口函数以更新 SQL Server 中的数据

Qt 创建器中的白色窗口

创建一个不出现在打印屏幕中的窗口

uwp 中的无铬窗口

创建 Visual Studio 扩展时如何获取源代码管理历史记录窗口中的选定项目?

从 SQL Server 中的时间窗口创建分组(组和岛)