当前位置:文档之家› CPP 注册表操作大全

CPP 注册表操作大全

C++ 操作注册表API (转载)1. 注册表简介注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件。

16位驱动在Winnt (Windows New Technology)下无法工作,所以所有设备都通过注册表来控制,一般这些是通过BIOS(基本输入输出系统)来控制的。

在Win95下,16位驱动会继续以实模式方式设备工作,它们使用system.ini来控制。

16位应用程序会工作在NT或者Win95 下,它们的程序仍然会参考win.ini和system.ini文件获得信息和控制。

2. 注册表结构2.1. 简介注册表是Windows程序员建造的一个复杂的信息数据库,它是多层次式的。

在不同系统上注册表的基本结构相同。

其中的复杂数据会在不同方式上结合,从而产生出一个绝对唯一的注册表。

计算机配置和缺省用户设置的注册表数据在Winnt中被保存在下面这五个文件中:DEFAULT,SAM,SECURITY,SOFTWARE,SYSTEM,NTUSER.DAT。

2.2. 数据结构注册表由键(或称“项”)、子键(子项)和值项构成。

一个键就是分支中的一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键。

一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成。

一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。

注册表的数据类型主要有以下四种:显示类型(在编辑器中)数据类型说明REG_SZ字符串文本字符串REG_MULTI_SZ多字符串含有多个文本值的字符串REG_BINARY二进制数二进制值,以十六进制显示REG_DWORD双字一个32位的二进制值,显示为8位的十六进制值2.3. 几个主键简介(1)HKEY_CLASSES_ROOT在注册表中HKEY_CLASSES_ROOT是系统中控制所有数据文件的项。

HKEY_CLASSES_ROOT控制键包括了所有文件扩展和所有和执行文件相关的文件。

它同样也决定了当一个文件被双击时起反应的相关应用程序。

HKEY_CLASSES_ROOT被用作程序员在安装软件时方便的发送信息,在Win95和Winnt中,HKEY_CLASSES_ROOT 和HKEY_LOCAL_MACHINE/Software/Classes是相同的。

程序员在运行他们的启动程序时不需要担忧实际的位置,相反的,他们只需要在HKEY_CLASSES_ROOT中加入数据就可以了。

(2)HKEY_CURRENT_CONFIGwin95一般只使用一个硬件配置文件。

如果有多个硬件配置文件。

HKEY_LOCAL_MACHINE/Config中就会添加一个键。

HKEY_LOCAL_MACHINE/Config 包含了HKEY_LOCAL_MACHINE中相同的数据。

在启动时,你可以选择你愿意使用的配置文件。

如果有多个安装,每次系统重新启动时,你就必须选择。

HKEY_CURRENT_CONFIG是在启动时控制目前硬件配置的键。

在系统启动以后,任何地方的变化都会自动影响到它。

程序员经常使用HKEY_CURRENT_CONFIG 方便的来存取配置信息。

HKEY_CURRENT_CONFIG包括了系统中现有的所有配置文件的细节。

你的选择影响了哪一个硬件配置文件成为现在的。

举例来说,如果配置0002被选择了,所有0002的配置信息会被映射到这些键上。

HKEY_CURRENT_CONFIG允许软件和设备驱动程序员很方便的更新注册表,而不涉及到多个配置文件信息。

HKEY_LOCAL_MACHINE中同样的数据和任何注册表的变化都会同时的变化。

(3)HKEY_USERSHKEY_USERS将缺省用户和目前登陆用户的信息输入到注册表编辑器,在win95中,它仅被那些配置文件激活的登陆用户使用,同样在winnt下,它也是这样。

win95从user.dat 中取得他们的信息,winnt从ntuser.dat中取得信息。

.dat文件包含了所有基于用户的注册表设置并且允许你取配置这些用户的环境。

如果你改变了缺省用户的设置,所有新用户会继承同样的设置。

而且,那些已经被建立的用户变的失效。

(4)HKEY_LOCAL_MACHINEHKEY_LOCAL_MACHINE是一个显示控制系统和软件的处理键。

HKLM键保存着计算机的系统信息。

它包括网络和硬件上所有的软件设置。

(比如文件的位置,注册和未注册的状态,版本号等等)这些设置和用户无关,因为这些设置是针对使用这个系统的所有用户的。

(5)HKEY_CURRENT_USERHKEY_CURRENT_USER包含着在HKEY_USERS安全辨别里列出的同样信息。

任何在HKEY_CURRENT_USER里的改动也都会立即HKEY_USERS改动。

相反也是这样。

HKEY_CURRENT_USER允许程序员和开发者易于存取目前登陆用户的设置。

通过建立这个键,微软很容易在不涉及到用户的SID下改变,添加和设置。

也就是说,所有当前的操作改变只是针对当前用户而改变,并不影响其他用户。

3. C++操作注册表3.1. CRegKey类及主要使用和函数说明所需要头文件:atlbase.h常用函数(1)打开一个键的函数:1RegOpenKeyEx函数定义:LONG RegOpenKeyEx(HKEY hKey,//已经打开的键的句柄,或者直接是上述几个根键LPCTSTR lpSubKey,//要打开的子键名字的地址DWORD ulOptions,//保留值,必须为0REGSAM samDesired,//打开方式,如读还是写PHKEY phkResult//返回的打开的子键的句柄);2RegOpenKey 这个函数与Windows 3.1兼容。

基于Win32的应用程序应该使用RegOpenKeyEx函数。

LONG RegOpenKey(HKEY hKey, // 要打开键的句柄LPCTSTR lpSubKey, // 要打开子键的名字的地址PHKEY phkResult // 要打开键的句柄的地址);注意:RegOpenKey这个函数与Windows 3.1兼容。

基于Win32的应用程序应该使用RegOpenKeyEx函数。

(2)查询某一个键值:RegQueryValueEx函数定义:LONG RegQueryValueEx(HKEY hKey,//要查询的键的句柄LPCTSTR lpValueName,//要查询的键值的名称LPDWORD lpReserved,//保留值LPDWORD lpType,//要查询的数据的类型LPBYTE lpData,//要返回的查询的数据LPDWORD lpcbData//预置的数据的长度);(3)设置一个键值RegSetValueEx函数定义:LONG RegSetValueEx(HKEY hKey,//要设置的键的句柄LPCTSTR lpValueName,//要访问的键值的名称LPDWORD lpReserved,//保留值DWORD dwType,//要设置的数据的类型const BYTE *lpData,//要设置的健值DWORD cbData//数据的长度);(4)新建指定键RegCreateKey函数定义:LONG RegCreateKey (HKEY hkey, // 要打开键的句柄LPCTSTR lpsubkey, // 要打开子键的名字的地址PHKEY phkresult // 已打开句柄的缓存区的地址);注意:如果这个键在注册表中已经存在,这个函数打开它。

(5)删除1删除注册表指定键下的值LONG RegDeleteValue(HKEY hKey, //子键的句柄LPCTSTR lpValueName //删除键值的名称);2删除注册表项(注册表文件夹)就用LONG RegDeleteKey(HKEY hKey, //已打开的键的句柄LPCTSTR lpSubKey //要删除的子键或路径);RegDeleteKey也可用来删除一个键值。

在Win 95/98 平台下,也可用来删除整个子键和键值。

但是在Windows NT/2000平台下,只能用来删除没有子键的键。

3删除一个带有很多子键值的键DWORD SHDeleteKey(HKEY hkey,// 注册表打开的键值的句柄LPCTSTR pszSubKey //被删除的键值名称);当然你得包含头文件shlwapi.h,并且添加shlwapi.lib。

注意:这个函数很危险,如在你的程序中使用SHDeleteKey(hkey,NULL),将删除HKEY_CURRENT_USER//SOFTWARE//Microsoft//Windows//CurrentVersion//Run下的所有值;如果使用SHDeleteKey(HKEY_CURRENT_USER,”SOFTWARE//Microsoft//Windows//CurrentVer sion//Run”),将删除HKEY_CURRENT_USER//SOFTWARE//Microsoft//Windows//CurrentVersion//Run这个键以及下面的所有子键和值。

3.2. 实例(1)读取注册表1查看HKEY_CURRENT_USER主键下Software//武汉帷幄信息技术有限公司//施工工艺决策系统//系统配置//BCGPGanttControls//GanttChartBCGPGantt-0子键中名称为GridProgressColumnIndex的值,其类型为DWORD。

void OnBnClickedQuery() //响应按钮IDC_QUERYHKEY hKEY;//定义有关的hKEY,在查询结束时要关闭//打开与路径data_Set相关的hKEYLPCTSTR data_Set= _T("/Software//武汉帷幄信息技术有限公司//施工工艺决策系统//系统配置//BCGPGanttControls//GanttChartBCGPGantt-0");//访问注册表,hKEY则保存此函数所打开的键的句柄if (ERROR_SUCCESS== ::RegOpenKeyEx(HKEY_CURRENT_USER,data_Set,0,KEY_READ,&hKEY)){DWORD dwValue;DWORD dwSize = sizeof(DWORD);DWORD dwType = REG_DWORD;if (::RegQueryValueEx(hKEY,_T("GridProgressColumnIndex"), 0, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS){AfxMessageBox(_T("错误:无法查询有关的注册表信息"));}//程序结束,关闭打开的hKEY::RegCloseKey(hKEY);}UpdateData(false);// TODO: 在此添加控件通知处理程序代码}可以看到读取的注册表GridProgressColumnIndex的值是正确的。

相关主题