前言:
前几天转载了一片名为《VC++:访问和修改系统注册表》的文章,今天有位朋友问到这篇文章的问题,仔细看了一下,有几处错误。现在将其修改并附上源代码,希望给想学习修改注册表的朋友一些帮助。
正文:
此例以修改用户注册信息(包括用户计算机名和公司名)为例,描述了如何对注册表信息进行查询和修改。原文为http://www.vczx.com/article/show.php?id=629,原文是针对win95和win98系统的,所附源代码是针对win2000系统的,其实只是注册表键值路径不同而已,win95/win98的用户的信息位于系统注册表中HKEY_LOCAL_MACHINE\Software Microsoft\Windows\CurrentVersion\的位置,而win2000系统位于HKEY_LOCAL_MACHINE\Software Microsoft\Windows\CurrentVersion\位置。键值名都是RegisteredOwner和RegisteredOrganization,分别表示用户的姓名和用户公司 的名称。
代码也比较简单,主要用到了四个API,RegOpenKeyEx打开注册表,RegQueryValueEx查询特定项,RegSetValueEx修改特定项。主要代码片段如下:
查询注册信息:
HKEY hKEY; //定义有关的 hKEY, 在查询结束时要关闭。
LPCTSTR data_Set="Software\\Microsoft\\Windows NT\\CurrentVersion\\";
//打开与路径 data_Set 相关的 hKEY,第一个参数为根键名称,第二个参数表。
//表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。
//访问注册表,hKEY则保存此函数所打开的键的句柄。
long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set, 0, KEY_READ, &hKEY));
if(ret0!=ERROR_SUCCESS) //如果无法打开hKEY,则终止程序的执行
{MessageBox("错误: 无法打开有关的hKEY!");
return;}
//查询有关的数据 (用户姓名 owner_Get)。
LPBYTE owner_Get=new BYTE[80];
DWORD type_1=REG_SZ ;
DWORD cbData_1=80;
//hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,″RegisteredOwner″。
//表示要查 询的键值名,type_1表示查询数据的类型,owner_Get保存所。
//查询的数据,cbData_1表示预设置的数据长度。
long ret1=::RegQueryValueEx(hKEY, "RegisteredOwner", NULL, &type_1, owner_Get, &cbData_1);
if(ret1!=ERROR_SUCCESS)
{
MessageBox("错误: 无法查询有关注册表信息!1");
return;
}
//查询有关的数据 (公司名 company_Get)
LPBYTE company_Get=new BYTE[80];
DWORD type_2=REG_SZ; DWORD cbData_2=80;
long ret2=::RegQueryValueEx(hKEY, "RegisteredOrganization", NULL,&type_2,company_Get, &cbData_2);
if(ret2!=ERROR_SUCCESS)
{
MessageBox("错误: 无法查询有关注册表信息!2");
return;
}
修改注册信息:
CString str_owner, str_company;
//通过对话框输入新的用户信息,保存到str_owner和str_company
GetDlgItemText(IDC_EDIT1,str_owner );
GetDlgItemText(IDC_EDIT2,str_company );
//定义有关的 hKEY, 在程序的最后要关闭。
HKEY hKEY;
LPCTSTR data_Set="Software\\Microsoft\\Windows NT\\CurrentVersion\\";
//打开与路径 data_Set 相关的hKEY,KEY_WRITE表示以写的方式打开。
long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_WRITE,&hKEY));
if(ret0!=ERROR_SUCCESS)
{
MessageBox("错误: 无法打开有关的hKEY!");
return;
}
//修改有关数据(用户姓名 owner_Set),要先将CString型转换为LPBYTE。
LPBYTE owner_Set=CString_To_LPBYTE(str_owner);
DWORD type_1=REG_SZ;
DWORD cbData_1=str_owner.GetLength()+1;
//与RegQureyValueEx()类似,hKEY表示已打开的键的句柄,″RegisteredOwner″
//表示要访问的键值名,owner_Set表示新的键值,type_1和cbData_1表示新值。
//的数据类型和数据长度
long ret1=::RegSetValueEx(hKEY, "RegisteredOwner", NULL, type_1, owner_Set, cbData_1);
if(ret1!=ERROR_SUCCESS)
{
MessageBox("错误: 无法修改有关注册表信息!");
return;
}
//修改有关的数据 (公司名 company_Set)
LPBYTE company_Set=CString_To_LPBYTE(str_company);
DWORD type_2=REG_SZ;
DWORD cbData_2=str_company.GetLength()+1;
long ret2=::RegSetValueEx(hKEY, "RegisteredOrganization", NULL,
type_2, company_Set, cbData_2);
if(ret2!=ERROR_SUCCESS)
{
MessageBox("错误: 无法修改有关注册表信息!");
return;
}
MessageBox("修改注册表信息成功!");
}
具体程序,请看源代码。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/