CPP注册表操作大全.docx
- 文档编号:10063247
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:14
- 大小:19.61KB
CPP注册表操作大全.docx
《CPP注册表操作大全.docx》由会员分享,可在线阅读,更多相关《CPP注册表操作大全.docx(14页珍藏版)》请在冰点文库上搜索。
CPP注册表操作大全
C++操作注册表API(转载)
1.注册表简介
注册表是为WindowsNT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件。
16位驱动在Winnt(WindowsNewTechnology)下无法工作,所以所有设备都通过注册表来控制,一般这些是通过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_CONFIG
win95一般只使用一个硬件配置文件。
如果有多个硬件配置文件。
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_USERS
HKEY_USERS将缺省用户和目前登陆用户的信息输入到注册表编辑器,在win95中,它仅被那些配置文件激活的登陆用户使用,同样在winnt下,它也是这样。
win95从user.dat中取得他们的信息,winnt从ntuser.dat中取得信息。
.dat文件包含了所有基于用户的注册
表设置并且允许你取配置这些用户的环境。
如果你改变了缺省用户的设置,所有新用户会继承同样的设置。
而且,那些已经被建立的用户变的失效。
(4)HKEY_LOCAL_MACHINE
HKEY_LOCAL_MACHINE是一个显示控制系统和软件的处理键。
HKLM键保存着计算机的系统信息。
它包括网络和硬件上所有的软件设置。
(比如文件的位置,注册和未注册的状态,版本号等等)这些设置和用户无关,因为这些设置是针对使用这个系统的所有用户的。
5)HKEY_CURRENT_USER
HKEY_CURRENT_USER
HKEY_CURRENT_USER
HKEY_CURRENT_USER
包含着在HKEY_USERS安全辨别里列出的同样信息。
任何在
里的改动也都会立即HKEY_USERS改动。
相反也是这样。
允许程序员和开发者易于存取目前登陆用户的设置。
通过建立这个键,微软很容易在不涉及到用户的SID下改变,添加和设置。
也就是说,所有当前的操作改变只是针对当前用户而改变,并不影响其他用户。
3.C++操作注册表
3.1.CRegKey类及主要使用和函数说明
所需要头文件:
atlbase.h
常用函数
1)打开一个键的函数:
1RegOpenKeyEx
函数定义:
LONGRegOpenKeyEx(HKEYhKey,//已经打开的键的句柄,或者直接是上述几个根键
LPCTSTRlpSubKey,//要打开的子键名字的地址
DWORDulOptions,//保留值,必须为0
REGSAMsamDesired,//打开方式,如读还是写
PHKEYphkResult//返回的打开的子键的句柄
);
2RegOpenKey这个函数与Windows3.1兼容。
基于Win32的应用程序应该使用
RegOpenKeyEx函数。
LONGRegOpenKey(HKEYhKey,//要打开键的句柄
LPCTSTRlpSubKey,//要打开子键的名字的地址
PHKEYphkResult//要打开键的句柄的地址);
注意:
RegOpenKey这个函数与Windows3.1兼容。
基于Win32的应用程序应该使用RegOpenKeyEx函数。
(2)查询某一个键值:
RegQueryValueEx
函数定义:
LONGRegQueryValueEx(HKEYhKey,//要查询的键的句柄
LPCTSTRlpValueName,//要查询的键值的名称
LPDWORDlpReserved,//保留值
LPDWORDlpType,//要查询的数据的类型
LPBYTElpData,//要返回的查询的数据
LPDWORDlpcbData//预置的数据的长度
);
(3)设置一个键值RegSetValueEx
函数定义:
LONGRegSetValueEx(HKEYhKey,//要设置的键的句柄
LPCTSTRlpValueName,//要访问的键值的名称
LPDWORDlpReserved,//保留值
DWORDdwType,//要设置的数据的类型
constBYTE*lpData,//要设置的健值
DWORDcbData//数据的长度
);
(4)新建指定键RegCreateKey
函数定义:
LONGRegCreateKey(HKEYhkey,//要打开键的句柄
LPCTSTRlpsubkey,//要打开子键的名字的地址
PHKEYphkresult//已打开句柄的缓存区的地址
);
注意:
如果这个键在注册表中已经存在,这个函数打开它。
(5)删除1删除注册表指定键下的值
LONGRegDeleteValue(HKEYhKey,//子键的句柄
LPCTSTRlpValueName//删除键值的名称
);
2删除注册表项(注册表文件夹)就用
LONGRegDeleteKey(HKEYhKey,//已打开的键的句柄
LPCTSTRlpSubKey//要删除的子键或路径
);
RegDeleteKey也可用来删除一个键值。
在Win95/98平台下,也可用来删除整个子键和
键值。
但是在WindowsNT/2000平台下,只能用来删除没有子键的键。
3删除一个带有很多子键值的键
DWORDSHDeleteKey(HKEYhkey,//注册表打开的键值的句柄
LPCTSTRpszSubKey//被删除的键值名称
);
当然你得包含头文件shlwapi.h,并且添加shlwapi.lib。
注意:
这个函数很危险,如在你的程序中使用SHDeleteKey(hkey,NULL),将删除
HKEY_CURRENT_USER//SOFTWARE//Microsoft//Windows//CurrentVersion//Run下的
所有值;如果使用
SHDeleteKey(HKEY_CURRENT_USER,”SOFTWARE//Microsoft//Windows//CurrentVersion//Run”,)将删除
HKEY_CURRENT_USER//SOFTWARE//Microsoft//Windows//CurrentVersion//Run这个
键以及下面的所有子键和值。
3.2.实例
(1)读取注册表
1查看HKEY_CURRENT_USER主键下Software//武汉帷幄信息技术有限公司//施工工艺决策系统〃系统配置//BCGPGanttControls//GanttChartBCGPGantt-0子键中名称为
GridProgressColumnlndex的值,其类型为DWORD。
HKEYhKEY;//定义有关的hKEY,在查询结束时要关闭
〃打开与路径data_Set相关的hKEY
LPCTSTRdata_Set=_T("/Software〃武汉帷幄信息技术有限公司〃施工工艺决策系统II系统
配置//BCGPGanttControls//GanttChartBCGPGantt-0");
//访问注册表,hKEY则保存此函数所打开的键的句柄
if(ERROR_SUCCESS
==:
:
RegOpenKeyEx(HKEY_CURRENT_USER,data_Set,O,KEY_READ,&hKEY))
{
DWORDdwValue;
DWORDdwSize=sizeof(DWORD);
DWORDdwType=REG_DWORD;
if(:
:
RegQueryValueEx(hKEY,_T("GridProgressColumnlndex"),0,&dwType,
(LPBYTE)&dwValue,&dwSize)!
=ERROR_SUCCESS)
{
AfxMessageBox(_T("错误:
无法查询有关的注册表信息"));
}
〃程序结束,关闭打开的hKEY
:
:
RegCloseKey(hKEY);
}
UpdateData(false);
//TODO:
在此添加控件通知处理程序代码
}
可以看到读取的注册表GridProgressColumnlndex的值是正确的。
2查看HKEY_LOCAL_MACHINE主键下SOFTWARE//Microsoft//Windows
NT//CurrentVersion子键中名称为"SoftwareType的值,其类型为REG_SZ。
HKEYhKEY;//定义有关的hKEY,在查询结束时要关闭
〃打开与路径data_Set相关的hKEY
LPCTSTRdata_Set=_T("SOFTWARE//Microsoft//WindowsNT//CurrentVersion");
//访问注册表,hKEY则保存此函数所打开的键的句柄
if(ERROR_SUCCESS
==:
:
RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY))
{
chardwValue[256];
DWORDdwSzType=REG_SZ;
DWORDdwSize=sizeof(dwValue);
if(:
:
RegQueryValueEx(hKEY,_T("SoftwareType"),0,&dwSzType,(LPBYTE)&dwValue,
&dwSize)!
=ERROR_SUCCESS)
{
AfxMessageBox(_T("错误:
无法查询有关的注册表信息"));
}
〃程序结束,关闭打开的hKEY
:
:
RegCloseKey(hKEY);
}
UpdateData(false);
//TODO:
在此添加控件通知处理程序代码
}
(2)写注册表
1在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司
//test111子键,设置其名称为Name,类型为DWORD,值为6。
HKEYhKey;//定义有关的hKEY,在查询结束时要关闭
HKEYhTempKey;
DWORDdwValue=6;
DWORDdwSize=sizeof(DWORD);
DWORDdwType=REG_DWORD;
//打开与路径data_Set相关的hKEY
LPCTSTRdata_Set=_T("Software//武汉帷幄信息技术有限公司");
if(ERROR_SUCCESS==:
:
RegOpenKeyEx(HKEY_CURRENT_USER,data_Set,0,KEY_SET_VALUE,&hKey))
{
//使用hKey来操作data_Set这个KEY里面的值。
if(ERROR_SUCCESS==:
:
RegCreateKey(hKey,_T("test111"),&hTempKey))
{//背景色
if(ERROR_SUCCESS!
=:
:
RegSetValueEx(hTempKey,_T("Name"),0,REG_DWORD,(CONSTBYTE*)&dwValue,sizeof(DWORD)))
{
AfxMessageBox(_T("错误"));
:
:
RegCloseKey(hKey);
return;
}
}
}
:
:
RegCloseKey(hKey);
//TODO:
在此添加控件通知处理程序代码
2在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司
//testlll子键,设置其名称为Name,类型为REG_SZ,值为China。
voidOnBnClickedChange()
{
HKEYhKey;//定义有关的hKEY,在查询结束时要关闭
HKEYhTempKey;
CStringm_name="China";
LPBYTEm_name_Set=CString_To_LPBYTE(m_name);//定义x轴名称
DWORDlength=m_name.GetLength()+1;//定义数据长度
〃打开与路径data_Set相关的hKEY
LPCTSTRdata_Set=_T("Software//武汉帷幄信息技术有限公司”);
if(ERROR_SUCCESS==:
:
RegOpenKeyEx(HKEY_CURRENT_USER,data_Set,O,KEY_SET_VALUE,&hKey))
{
//使用hKey来操作data_Set这个KEY里面的值。
if(ERROR_SUCCESS==:
:
RegCreateKey(hKey,_T("test111"),&hTempKey))
{
if(ERROR_SUCCESS!
=:
:
RegSetValueEx(hTempKey,_T("Name"),0,REG_SZ,
m_name_Set,length))
{
AfxMessageBox(_T("错误"));
:
:
RegCloseKey(hKey);
return;
}
}
:
:
RegCloseKey(hKey);
UpdateData(false);
//TODO:
在此添加控件通知处理程序代码
}
3在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司〃test111子键,设置其名称为Name,类型为REG_BINARY,值为ffac054e。
voidOnBnClickedChange()
{
HKEYhKey;//定义有关的hKEY,在查询结束时要关闭
HKEYhTempKey;
BYTEm_name[10];
memset(m_name,0,sizeof(m_name));〃将数组m_name清零
m_name[0]=0xff;
m_name[1]=Oxac;
m_name[2]=0x05;
m_name[4]=0x4e;
〃打开与路径data_Set相关的hKEY
LPCTSTRdata_Set=_T("Software〃武汉帷幄信息技术有限公司”);
if(ERROR_SUCCESS==:
:
RegOpenKeyEx(HKEY_CURRENT_USER,
data_Set,O,KEY_SET_VALUE,&hKey))
{
//使用hKey来操作data_Set这个KEY里面的值。
if(ERROR_SUCCESS==:
:
RegCreateKey(hKey,_T("test111"),&hTempKey))
{if(ERROR_SUCCESS!
=:
:
RegSetValueEx(hTempKey,_T("Name"),0,
REG_BINARY,(unsignedchar*)m_name,5))
AfxMessageBox(_T(”错误"));
:
:
RegCloseKey(hKey);
return;
}
}
}
:
:
RegCloseKey(hKey);
UpdateData(false);
//TODO:
在此添加控件通知处理程序代码
}
(3)删除注册表
1删除HKEY_CURRENT_USER〃Software〃武汉帷幄信息技术有限公司〃test111的键值
Name
voidOnBnClickedDelete()
{
HKEYhKey;//定义有关的hKEY,在查询结束时要关闭
〃打开与路径data_Set相关的hKEY
LPCTSTRdata_Set=_T("Software//武汉帷幄信息技术有限公司〃test111”):
if(ERROR_SUCCESS==:
:
RegOpenKeyEx(HKEY_CURRENT_USER,data_Set,O,KEY_SET_VALUE,&hKey))
{
//使用hKey来操作data_Set这个KEY里面的值。
if(ERROR_SUCCESS!
=:
:
RegDeleteValue(hKey,_T("Name")))
{
AfxMessageBox(_T("错误"));
:
:
RegCloseKey(hKey);
return;
}
}
:
:
RegCloseKey(hKey);
UpdateData(FALSE);
//TODO:
在此添加控件通知处理程序代码
}
2删除HKEY_CURRENT_USER//Software//武汉帷幄信息技术有限公司下的子键test111。
voidOnBnClickedDelete()
{
HKEYhKey;//定义有关的hKEY,在查询结束时要关闭
//打开与路径data_Set相关的hKEY
LPCTSTRdata_Set=_T("Software//武汉帷幄信息技术有限公司");
if(ERROR_SUCCESS==:
:
RegOpenKeyEx(HKEY_CURRENT_USER,
data_Set,0,KEY_SET_VALUE,&hKey))
{
//使用hKey来操作data_Set这个KEY里面的值。
if(ERROR_SUCCESS!
=:
:
RegDeleteKey(hKey,"test111"))
{
AfxMessageBox(_T("错误"));
:
:
RegCloseKey(hKey);
return;
}
:
:
RegCloseKey(hKey);
UpdateData(FALSE);
//TODO:
在此添加控件通知处理程序代码
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CPP 注册表 操作 大全