Win32中有两个API函数,CreateWindow和RegisterClass。它们有一个HINSTANCE参数,很多人对这个参数不是很理解,今天就来讲一讲。

窗口类的名称还不足以唯一地确定这个窗口类。每一个进程都会拥有它自己的窗口类列表,而在这个列表中的每个条目都会包含一个实例句柄和一个窗口类名称。
举个例子,如果一个程序有两个 DLL,这两个 DLL 都注册了一个类名“MyClass”,并将 DLL 的句柄作为 HINSTANCE 传递,则窗口类列表可能如下所示。

>> 请前往Topomel查看图片 <<

在创建窗口的时候,每个模块在创建窗口时都会传递自己的HINSTANCE,窗口管理器使用实例句柄和类名的组合来查找窗口类,代码如下:
CreateWindow(“MyClass”, …, hinstA, …); // 使用A.DLL中的窗口类创建窗口
CreateWindow(“MyClass”, …, hinstB, …); // 使用B.DLL中的窗口类创建窗口
CreateWindow(“MyClass”, …, hinstC, …); // 没有找到窗口类,创建失败

这就是为什么多个DLL都注册一个名为“MyClass”的类是可以的,因为我们可以通过实例句柄来区分它们。

但是,上述规则有一个例外。 如果你在注册类时传递了CS_GLOBALCLASS标志,则窗口管理器在查找类时将忽略实例句柄。 所有USER32类都注册为全局类。 因此,以下所有调用都会创建 USER32 编辑控件:
CreateWindow(“edit”, …, hinstA, …);
CreateWindow(“edit”, …, hinstB, …);
CreateWindow(“edit”, …, hinstC, …);

如果要注册一个类以供其他模块在对话框中使用,则需要注册为CS_GLOBALCLASS,因为正如我们之前看到的,在创建对话框期间执行的内部 CreateWindow 调用以创建控件将对话框的 HINSTANCE 作为 HINSTANCE 参数传递。 由于对话框实例句柄通常是创建对话框的DLL(因为使用相同的 HINSTANCE 来查找模板),未能使用 CS_GLOBALCLASS 标志注册意味着,窗口类查找将找不到该类,因为它已注册在提供类的DLL的实例句柄,而不是使用它的那个。

在 16 位 Windows 中,实例句柄也做了其他事情,但它们不再与 Win32 相关。

一个常见的错误是,在注册窗口类时传递一些其他模块(通常是主可执行文件)的 HINSTANCE。 现在你应该了解了 HINSTANCE 的用途,也应该解释使用错误的HINSTANCE 注册类所带来的后果。Do you?

总结

理解一个应用程序的骨架:注册窗口类,创建窗口,显示和更新窗口,启动消息循环。
是一名Win32写手的基本要求。
它是桌面应用的基石,很难改变,我们生命中所应该追求的,就是那些很难改变的东西。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《What is the HINSTANCE passed to CreateWindow and RegisterClass used for?》

为什么需要传递HINSTANCE给CreateWindow?相关推荐

  1. win32窗口问题-CreateWindow创建窗口一直失败

    使用背景 利用VS创建空项目,使用WinMain入口构建代码创建一个win32窗口时,运行老是不显示窗口,调试发现程序在CreateWindow时老是产生失败结果: 就是上图,_hWnd获取Creat ...

  2. 手把手教你写第一个Windows窗口

    第一个Windows窗口 效果展示 详细过程 设计窗口类 注册窗口类 创建窗口 显示窗口 更新窗口 消息循环 源代码 实用工具 图标制作软件 图标库 效果展示 第一个Windows窗口 详细过程 设计 ...

  3. 《Windows程序设计》读书笔十一 对话框

    第十一章  对话框 基于模板的对话框,包含了弹出窗口,和子窗口控件,而且有一个窗口过程来处理对话框消息. 包括键盘和鼠标的输入. 称为 "对话框管理器"  和标准的Windows窗 ...

  4. Windows编程-001

    如果建立的是Win32控制台工程(入口函数是main函数)的话,WinMain函数不能作为入口函数,如果想要解决这个问题的话,可以打开项目属性->链接器->系统->子系统,把子系统对 ...

  5. Win32 GDI 学习总结

    Windows GDI 教程(一) 一个简单的绘图程序 http://www.tuicool.com/articles/jeMBZ3v 常见的图形编程库,除了 GDI 外还有 GDI+.OpenGL. ...

  6. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理

    本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7405479 作者:毛星云    邮箱: happyl ...

  7. 【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类

    本系列文章由zhmxy555编写,转载请注明出处. http://qianmo.blog.51cto.com/5127279/875711 作者:毛星云 邮箱: happylifemxy@qq.com ...

  8. DLL的高级操作技术——Windows核心编程学习手札之二十

    DLL的高级操作技术 --Windows核心编程学习手札之二十 显示加载DLL模块: HINSTANCE LoadLibrary(PCTSTR pszDLLPathName); HINSTANCE L ...

  9. VTK修炼之道4_Win32控制台项目

    1.类的定义 myVTKapp.h #include "windows.h" #include "vtkConeSource.h" #include " ...

最新文章

  1. 我的超级大魔王Cookie
  2. js php 正则差别,正则表达式(括号)、[中括号]、{大括号}的区别小结,正则表达式小结...
  3. CTF web题总结--unserizable
  4. 【杂文】企业数字化转型展望—角色转型
  5. 参加Tech.Ed 2006北京行
  6. ML.NET 0.8特性简介
  7. 导入表格只有一行 帆软_万万没想到!把x个表格合合合合成一份,10分钟就搞定...
  8. dababase 差异
  9. 02-HTML标签语法+字体标记
  10. 新经济 DTC 转型,一个简单而强大的数据平台至关重要
  11. 解决 Win7 远程桌面 已停止工作的问题
  12. 举个栗子!Tableau 技巧(109):用 LOD 计算产品销售周期
  13. Elesticsearch(es)聚合搜索(入门到精通)4
  14. python中reduce函数的作用_python中reduce()函数的使用方法示例
  15. 【SpringCloud】 - Feign 踩坑记录:404 ,调用不成功 , 接口定义规范 等问题记录
  16. uni-app开发的APP项目上线后,登录后自动检测更新,点击下载并安装,可手动检测版本更新,实现扫码下载功能
  17. Python 用plt做动画
  18. OS学习笔记-21(清华大学慕课)文件系统
  19. 查看电脑连接的WiFi密码的两种方法
  20. MacBook Air移动硬盘分区

热门文章

  1. 如何理解面向对象(什么是面向对象?)
  2. 部署卡巴斯基网络版6.0:安装控制中心和服务器端推送
  3. arcgis伪节点检查_兼顾属性信息的矢量伪节点检查及自动消除方法
  4. OSS异常:com.aliyun.oss.ClientException:UnknownHost
  5. JavaSE中的方法
  6. iMX6UL---zlg M6G2C开发板内核编译记录
  7. semanticui图标大全
  8. C++ 实现磁盘初始化
  9. 【ESP 保姆级教程】疯狂传感器篇 —— 案例:ESP8266 + 水位传感器 + 串口输出
  10. 视频编码标准汇总及比较