怎样在VC++中访问和修改注册表[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 amh 的 blog

windows95/98/me的注册表包含了windows95/98/me的系统配置、pc机的硬件配置、win32应用程序和用户的其他设置信息。注册表和ini文件不同,它是多层次的树状数据结构,具有六个分支(根键),每个分支又由许多的键和键值组成,而每个键则代表一个特定的配置项目。

    在实际编程工作中,我们遇到了如何在visual c++中对windows95/98/me注册表整个树状结构信息进行访问和修改的问题,如查询和修改注册表中用户姓名和公司名称的有关信息。通过编程实践,我们实现了在visual c++中查询和修改系统注册表的有关信息。下面以一个实例说明具体的编程方法。

    在visual c++ 6.0或5.0环境中新建一基于对话框的工程,设置两个命令按钮,名为“查询用户信息”和“修改用户信息”,用来查询和修改注册表中用户姓名和公司名称。这里须要指出的是,用户的信息位于系统注册表中\hkey_local_machine\software\microsoft\windows\currentversion\ 的位置,键值名registeredowner和registeredorganization分别表示用户的姓名和用户公司的名称。 

1.查询用户信息的代码

hkey hkey; //定义有关的 hkey, 在查询结束时要关闭。 
lpctstr data_set="software\\microsoft\\windows\\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("错误: 无法查询有关注册表信息!"); 
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("错误: 无法查询有关注册表信息!"); 
return; 

// 将 owner_get 和 company_get 转换为 cstring 字符串, 以便显示输出。 
cstring str_owner=cstring(owner_get); 
cstring str_company=cstring(company_get); 
delete[] owner_get; delete[] company_get; 
// 程序结束前要关闭已经打开的 hkey。 
::regclosekey(hkey); 
…… 

    这样,上述程序执行完毕,字符串str_owner和str_company则表示查询到的用户的姓名和公司的名称,在vc++中便可用对话框的方式将其显示出来。

2.修改用户信息的代码

    注意和上述的查询代码属于不同的函数体。 
    在程序中我们先显示一个对话框,要求用户输入新的用户姓名和公司名称并按确认键,将取得cstring类型的有关字符串。要先将其转换为lpbyte(即unsigned char*)型的数据类型,以便后面的函数调用。下面是程序中用到的将cstring型转换为lpbyte的转换函数: 
lpbyte cstring_to_lpbyte(cstring str) 

lpbyte lpb=new byte[str.getlength()+1];  
for(int i=0;(i<str.getlength())&&(*(lpb+i) = str.getat(i));i++)
return lpb;


以下则是具体的修改注册表用户信息的代码:

cstring str_owner, str_company; 
…… //通过对话框输入新的用户信息,保存到str_owner和str_company 
//定义有关的 hkey, 在程序的最后要关闭。 
hkey hkey;  
lpctstr data_set="software\\microsoft\\windows\\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) 

本文关键:怎样在VC++中访问和修改注册表
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top