转载请注明出自:blog.youkuaiyun.com/mingojiang
一、注册表基础
1.1注册表历史背景
什么是注册表?我们可以把注册表理解成一种数据库,里面保存着各种数据,如:系统的配置信息,桌面环境,系统软件,IE浏览器等等软件的信息。在微软以前发布的操作系统中(如windows 3.X),把这些信息保存在System.ini,Win.ini等文件中,随着数据量越来越大,越来越复杂,这样ini文件难以胜任,从windows 95开始引入注册表来保存这些复杂的,海量的数据,总之我们权且把它当着一个数据库吧。
1.2注册表作用
注册表的用处一下也说不全,我作为一个程序员,站在程序员的角度来讲讲吧。对我来讲,注册表最直接的用处,就是用来保存一些配置信息,如开发的桌面软件,一定会有些配置数据需要保存,那么我们可以像Windows早期版本那个,保存在ini文件中,不过ini文件容易被人修改。如果保存在注册表中,稍稍保密些,一般使用者也不懂得怎么改。注册表另外一个常用功能是,修改其他软件的配置信息,如浏览器的个性设置,电脑桌面的主题设置,光标配置等,不过这些对开发人员来讲,好像意义不是很大,修改别人的软件配置干什么,是吧?如果你是黑客那就另当别论了。
注册表还保存着硬件的一些驱动相关信息,如COM口的数据,串口通信编程时,你是不是会为判断PC机是否有串口驱动而烦恼呀,不知道PC机上的串口逻辑号是多少很烦心呢?其实这些数据在注册表里都有,到注册表里一查就清楚了,关于如何判断PC机串口是否正常,PC现在有串口逻辑号是多少的相关技术,在本人博文《串口通信编程--多线程异步方式》里有详细的介绍,还有代码参考。
用注册表保存配置信息,那么我们得先大体认识一下注册表的组成与架构,然后再介绍一下如何创建,查询,修改注册表。
1.3注册表结构
打开注册表:可能通过控制面板打开,也有很多其他途径能打开,本人常用方法是在【开始】菜单中选择【运行】命令,然后在框中输入命令regedit,如图:
然后点【确定】按钮,将会打开注册表,如图:
从图中可看出,注册表是层叠式构架的,左边的树形列表,第一级有5个根键,点开第一级接着有第二级,第三级等等,这叫项,也就是说,根键下面的是项,而项下面如果还有子级那叫子项,直到最后一级如图中路径”HKEY_CURRENT_CONFIG\SOFTWARE\FONTS”,其中Fonts是Software的子项,Fonts是最后一级,它没有子项了,再Fonts下面就是值项了,在右边一栏,值项由名称,类型,数据组成,值项就是最终保存具体数据的地方。
所以说,注册表由:键----项----子项----值项构成,而值项由:名称,类型,数据组成,其中名称就不用说了,数据也不用说了,说说类型吧,类型是指数据的类型,数据的类型有很多种,从其他资料中切个图吧,更直观:

看到没,乱糟糟的一堆,总之对一般程序员来说,我们别管那么多,把它们分成两在类:数值型与字符型,数值型分整型与二进制型,其中整形有4字节8字节等,还分高位在前还是低位在前呢,反正自己看了,一看就懂,我也就不多说了。字符串也更不多说了,自己看一下就懂了。
总结一下,注册表与根键、项(子项)、值项组成,根键与项是用来区别层次关系的,不具体存储数据,项下面有子项的同时还可以有值项。值项是具体存储数据的,形式是:名称、类型、值。先把这种关系捋顺了,下面看起来就容易了。
1.4各根键主要存储的信息
Ø HKEY_CLASSES_ROOT
定义了系统中所有文件类型标志和基本操作标志
Ø HKEY_CURRENT_USER
当前用户的配置信息,包括环境变量、桌面设置、网络连接,软件运行信息等
Ø HKEY_LOCAL_MACHINE
本机相关的系统信息,包括硬件信息,驱动信息,内存数据,总线数据等等。
Ø HKEY_USER
所有用户的信息。
Ø KKEY_CURRENT_CONFIG
本地计算机启动时配置的相关信息,如环境信息,桌面主题,背景色之类。
1.5手动操作注册表
打开注册表编辑器:【开始】菜单选择运行命令,输入regedit,【确定】,打开注册表编辑器,你可以在上面创建,修改,删除,还有查找等等操作。都是可视化操作,自己动手操作一下就懂,不赘述。
二、注册表编程
本章介绍注册表的创建、修改、查询等知识。通过低层的API实现。
2.1相关函数分类
关于注册表的函数可大致分为:项管理类,值项管理类,杖举类,实用类,安全类。项管理与值项管理不言而喻是对项与值项的增删改查操作的。杖举是对项与值项数据进行分析查找。实用类是远程操作的,操作远程计算机的注册表。安全类主要是对注册表的安全信息操作。常用的是项管理,值项管理与杖举这三类。后面我们也介绍这三类。其他的不深究,如果想了解的,可以联系我,我有相关电子档书籍。
2.2项管理函数
很多书籍中分项,还有子项,弄得一头雾水,其实子项是相对而言的,有父项才有子项之说,所以说子项也是项,子项也可能是某项的父项,这个概念要搞清楚。
项管理函数是对项(子项)的创建、打开、关闭、删除的几个操作,分4个函数,下面一一介绍。
2.2.1项创建函数
RegCreateKeyEx与RegCreateKey,后者请不要再用,win32以后版本都用前者。此函数的功能是在指定项下建一子项。
LONG WINAPI RegCreateKeyEx(
__in HKEY hKey,
__in LPCTSTR lpSubKey,
__reserved DWORD Reserved,
__in_opt LPTSTR lpClass,
__in DWORD dwOptions,
__in REGSAM samDesired,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__out PHKEY phkResult,
__out_opt LPDWORD lpdwDisposition
);
hKey父项:打开的句柄,表明在此项下建立子项,也可以是五个(大多数windows版本是五个,也有六个的)根键之一,就是以下常量:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT_CONFIG
lpSubKey子项名称:你要创建的子项,接在父项下,如:” REGTEST\\GPS设备网络通道\\”.
Reserved:必须为0
lpClass:建议为NULL
dwOptions:标志创建的注册表保存在文件中还是内存中
一般取值REG_OPTION_NON_VOLATILE更多信息请查MSDN
samDesired:访问权限,有读、写、查询等等,取KEY_ALL_ACCESS全部权限即可
lpSecurityAttributes:安全属性,不知道怎么设置,取NULL即可
phkResult:创建成功后,返回的新项的句柄
lpdwDisposition:返回状态描述,有两种状态,项原来存在|
项是新建的(REG_CREATED_NEW_KEY|REG_OPENED_EXISTING_KEY)
返回值:成功返回ERROR_SUCCESS
以下是伪代码:
HKEY hKey;
DWORD dw;
if(ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_CONFIG,
" REGTEST\\GPS设备网络通道\\", 0,
NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
NULL, &hKey, &dw))
AfxMessageBox (_T(“创建成功”));
效果切图:

2.2.2项打开函数
RegOpenKeyEx打开一个注册表项,语法定义如下:
LONG WINAPI RegOpenKeyEx(
__in HKEY hKey, //可以是根键,也可以是打开的项
__in_opt LPCTSTR lpSubKey,//需要打开的子项名称
__reserved DWORD ulOptions,//同上
__in REGSAM samDesired,//访问权限,同上
__out PHKEY phkResult//打开成功后,返回项的句柄
);
以下库伪代码:
HKEY hKey;
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_CONFIG,
" REGTEST\\GPS设备网络通道\\", 0, KEY_ALL_ACCESS, &hKey))
AfxMessageBox(_T("打开成功"));
2.2.3项关闭函数
RegCloseKey这个就太简单了,只有一个参数,就是关闭打开的项
LONG WINAPI RegCloseKey(
__in HKEY hKey//传入一个打开的项的句柄
);
伪代码:
HKEY hKey;
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_CONFIG,
" REGTEST\\GPS设备网络通道\\", 0, KEY_ALL_ACCESS, &hKey)){
if (ERROR_SUCCESS == RegCloseKey(hKey))

本文详细介绍了注册表的基础知识,包括注册表的历史、作用、结构、根键及功能。并深入讲解了注册表编程,涵盖项管理、值项管理和注册表遍历的相关函数,包括创建、打开、关闭、删除项,设置、查询、删除值项。最后提供了多个示例代码,演示了如何使用这些函数进行实际操作。
最低0.47元/天 解锁文章
885





