注册表编程

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

转载请注明出自:blog.youkuaiyun.com/mingojiang 

一、注册表基础

1.1注册表历史背景

什么是注册表?我们可以把注册表理解成一种数据库,里面保存着各种数据,如:系统的配置信息,桌面环境,系统软件,IE浏览器等等软件的信息。在微软以前发布的操作系统中(windows 3.X),把这些信息保存在System.iniWin.ini等文件中,随着数据量越来越大,越来越复杂,这样ini文件难以胜任,从windows 95开始引入注册表来保存这些复杂的,海量的数据,总之我们权且把它当着一个数据库吧。

1.2注册表作用

注册表的用处一下也说不全,我作为一个程序员,站在程序员的角度来讲讲吧。对我来讲,注册表最直接的用处,就是用来保存一些配置信息,如开发的桌面软件,一定会有些配置数据需要保存,那么我们可以像Windows早期版本那个,保存在ini文件中,不过ini文件容易被人修改。如果保存在注册表中,稍稍保密些,一般使用者也不懂得怎么改。注册表另外一个常用功能是,修改其他软件的配置信息,如浏览器的个性设置,电脑桌面的主题设置,光标配置等,不过这些对开发人员来讲,好像意义不是很大,修改别人的软件配置干什么,是吧?如果你是黑客那就另当别论了。

注册表还保存着硬件的一些驱动相关信息,如COM口的数据,串口通信编程时,你是不是会为判断PC机是否有串口驱动而烦恼呀,不知道PC机上的串口逻辑号是多少很烦心呢?其实这些数据在注册表里都有,到注册表里一查就清楚了,关于如何判断PC机串口是否正常,PC现在有串口逻辑号是多少的相关技术,在本人博文《串口通信编程--多线程异步方式》里有详细的介绍,还有代码参考。

用注册表保存配置信息,那么我们得先大体认识一下注册表的组成与架构,然后再介绍一下如何创建,查询,修改注册表。

 

1.3注册表结构

        打开注册表:可能通过控制面板打开,也有很多其他途径能打开,本人常用方法是在【开始】菜单中选择【运行】命令,然后在框中输入命令regedit,如图:

然后点【确定】按钮,将会打开注册表,如图:

从图中可看出,注册表是层叠式构架的,左边的树形列表,第一级有5个根键,点开第一级接着有第二级,第三级等等,这叫项,也就是说,根键下面的是项,而项下面如果还有子级那叫子项,直到最后一级如图中路径”HKEY_CURRENT_CONFIG\SOFTWARE\FONTS”,其中FontsSoftware的子项,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项创建函数

RegCreateKeyExRegCreateKey,后者请不要再用,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_KEYREG_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))

         

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MingoJiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值