分享
 
 
 

如何在VC++中使用注册表

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

如何在VC++中使用注册表

如今修改注册表成为继超频之后的又一大热点,许多CFAN通过对注册表的修改使Win98显得更加个性化,诸多报刊杂志也纷纷扯起注册表这面旗帜,令人遗憾的是,在介绍注册表修改的众多的文章中,大都以手工修改为例,极少数文章也只介绍有关修改注册表软件的用法,至于如何在程序中实现却无人提及。为此我在Visual Studio6.0帮助文件中用Registry关键字进行搜索,在翻译软件帮助下及不断的上机实践下,我终于摸索出使用注册表接口(API)函数的一些用法,现拿出来与大家共享。

在程序中使用注册表,不外乎创建、打开、读取、设置、删除这五个常规操作,(要想获得更详细的资料可以参考Visual Studio6.0帮助目录中MSDN Library Visual Studio6.0|Platform SDK|Window Base Services|General Library|Registry条目)。下面我们就来关注这五个接口函数的用法:

一、 创建键RegCreateKeyEx

通过RegCreateKeyEx函数可以在注册表中创建键,如果需要创建的键已经存在了,则打开键。函数原型如下:

LONG RegCreateKeyEx(

HKEY hKey,

LPCTSTR lpSubKey,

DWORD Reserved,

LPTSTR lpClass,

DWORD dwOptions,

REGSAM samDesired,

LPSECURITY_ATTRIBUTESlpSecurityAttributes,

PHKEY phkResult,

LPDWORD lpdwDisposition

);

各参数及返回值的含义如下:

·hKey为主键值,可以取下面的一些数值:

HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG

HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE

HKEY_USER、HKEY_PERFORMANCE_DATA(WINNT操作系统)

HKEY_DYN_DATA(WIN9X操作系统)

·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含将要创建或打开的子键的名称。子键不可以用反斜线(\)开始。该参数可以为NULL。

·Reserved保留,必须设置为0。

·参数lpClass一个指向包含键类型的字符串。如果该键已经存在,则忽略该参数。

·参数dwOptions为新创建的键设置一定的属性。可以取下面的一些数值:

REG_OPTION_NON_VOLATILE 新创建的键为一个非短暂性的键(数据信息保存在文件中,当系统重新启动时,数据信息恢复)

REG_OPTION_VOLATILE 新创建的键为一个短暂性的键(数据信息保存在内存中)。Windows95忽略该数值。

REG_OPTION_BACKUP_RESTORE 仅在WINNT中支持,可以提供优先级支持。

·参数samDesired用来设置对键访问的权限,可以取下面的一些数值:

KEY_CREATE_LINK 准许生成符号键

KEY_CREATE_SUB_KEY 准许生成子键

KEY_ENUMERATE_SUB_KEYS 准许生成枚举子键

KEY_EXECUTE 准许进行读操作

KEY_NOTIFY 准许更换通告

KEY_QUERY_VALUE 准许查询子键

KEY_ALL_ACCESS 提供完全访问,是上面数值的组合

KEY_READ 是下面数值的组合:

KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_NOTIFY

KEY_SET_VALUE 准许设置子键的数值

KEY_WRITE 是下面数值的组合:

KEY_SET_VALUE、KEY_CREATE_SUB_KEY

·参数lpSecurityAttributes为一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否被子处理过程继承。如果该参数为NULL,则句柄不可以被继承。在WINNT中,该参数可以为新创建的键增加安全的描述。

·参数phkResult为一个指向新创建或打开的键的句柄的指针。

·参数lpdwDispition指明键是被创建还是被打开的,可以是下面的一些数值:

REG_CREATE_NEW_KEY 键先前不存在,现在被创建。

REG_OPENED_EXISTING_KEY 键先前已存在,现在被打开。

·返回值 如果函数调用成功,则返回ERROR_SUCCESS。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码,可以通过设置FORMAT_MESSAGE_FROM_SYSTEM标识调用FormatMessage函数来获取一个对错误的总体描述。

二、 打开一个键RegOpenKeyEx

RegOpenKeyEx函数可以打开一个指定的键,函数原型如下:

LONG RegOpenKeyEx(

HKEY hkey,

LPCTSTR lpSubKey,

DWORD ulOption,

REGSAM samDesired,

PHKEY phkResult

);

各参数及返回值的含义如下:

·参数hKey的含义同RegCreateKeyEx函数中的hKey参数。

·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含子键的名称,可以利用反斜线(\)分隔不同的子键名。如果字符串为空,则根据hKey参数创建一个新的句柄。在这种情况下,并不关闭先前打开的句柄。

·ulOption保留,通常必须设置为0。

·参数samDesired的含义同RegCreateKeyEx函数中的samDesired参数。

·参数phkResult为一个指针,用来指向打开的键的句柄。可以通过RegCloseKey函数关闭这个句柄。

·返回值同RegCreateKeyEx函数的返回值。

三、 读取键RegQueryValueEx

通过RegQueryValueEx函数可以从一个已经打开的键中读取数据,函数原型如下:

LONG RegQueryValueEx(

HKEY hKey,

LPTSTR lpValueName,

LPDWORD lpReserved,

LPDWORD lpType,

LPBYTE lpData,

LPDWORD lpcbData

);

各个参数及返回值的含义如下:

·参数hKey为当前的一个打开的键的句柄,具体数值同RegCreateKeyEx函数的hKey参数。

·参数lpVauleName为一个指向非空的包含查询值的名称的字符串指针。

·lpReserved保留,必须为NULL。

·参数lpType为一个指向数据类型的指针,数据类型为下列类型之一:

REG_BINARY 二进制数据

REG_DWORD 32位整数

REG_DWORD_LITTLE_ENDIAN little-endian格式的数据,例如0X12345678以(0X78 0X56 0X34 0X12)方式保存

REG_DWORD_BIG_ENDIAN big-endian格式的数据,例如0X12345678以(0X12 0X34 0X56 0X78)方式保存

REG_EXPAND_SZ 一个包含未扩展环境变量的字符串

REG_LINK 一个Unicode类型的链接

REG_MULIT_SZ 以两个零结尾的字符串

REG_NONE 无类型数值

REG_RESOURCE_LIST 设备驱动资源列表

REG_SZ 一个以零结尾的字符串根据函数使用的字符集类型的不同而设置为Unicode或ANSI类型的字符串

·参数lpData为一个指向保存返回值的变量的指针。如果不需要返回值,该参数可以为NULL。

·参数lpcbData为一个指向保存返回值长度的变量的指针。其中长度以字节为单位。如果数据类型为REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ,那么长度也包括结尾的零字符,只有在参数lpData为NULL时,参数lpcbData才可以为NULL。

·返回值同RegCreateKeyEx函数的返回值。

四、 设置键值RegSetValueEx

RegSetValueEx函数可以设置注册表中键的值,函数原型如下:

LONG RegSetValueEx(

HKEY hKey,

LPCTSTR lpValueName,

DWORD Reserved,

DWORD dwType,

CONST BYTE *lpData,

DWORD cbData

);

各个参数及返回值的含义如下:

·参数hKey的含义同RegCreateKeyEx函数中的hKey参数。

·参数lpValueName为一个指向包含值名的字符串指针。

·Reserved保留,通常必须设置为0。

·参数dwType确定了设置的值的类型同RegQueryValueKeyEx的lyType参数。

·参数lpData为一个指向包含数据的缓冲区的指针。

·参数cbData以字节为单位,指定数据的长度。

·返回值同RegCreateKeyEx函数的返回值。

五、 删除键值RegDeketeKey

函数RegDeketeKey删除一个键及所有的子键。函数原型如下:

LONG RegDeleteKey(

HKEY hKey,

LPCTSTR lpSubKEY

);

各个参数及返回值的含义如下:

·参数hKey的含义同RegCreateKeyEx函数中的hKey参数。

·参数lpSubKey的含义同RegCreateKeyEx函数中的lpSubKey参数。

六、 示例

下面我们在Visual C++6.0或5.0环境中新建一基于对话框的工程。设置两个命令按钮,名为“查询用户信息”和“修改用户信息”,用来查询和修改注册表中的用户姓名和公司名称。需要说明的是,用户的信息位于系统注册表中\KEY-CURRENT-USER\Software\Micrsoft\MS Setup(ACME)\User Info\的位置,键值名DefName和DefCompany分别表示用户的姓名和用户公司的名称。

1、 查询用户信息的代码

HKEY hKey; //定义有关的hKey,在查询结束时要关闭。

LPCTSTR path="Software\\Micrsoft\\MS Setup(ACME)\\User Info\\”;

LONG return0=(::RegOpenKeyEx(HKEY_CURRENT_USER,path,0,KEY_READ,&hKey));

if(return0!=ERROR_SUCCESS)

{

MessageBox("错误:无法打开有关的键!");

Return;

}

LPBYTE username_Get=new BYTE[80];

DWORD type_1=REG_SZ;

DWORD cbData_1=80;

LONG return1=::RegQueryValueEx(hKey,"Defname:,NULL,&type_1,

username_Get,&cbData_1);

if(return1!=ERROR_SUCCESS)

{

MessageBox("错误:无法查询有关注册表信息!");

Return;

}

LPBYTE company_Get=new BYTE[80];

DWORD type_2=REG_SZ;

DWORD cbData_2=80;

LONG return2=::RegQueryValueEx(hKey,"DefCompany",NULL,&type_2,

company_Get,&cbData_2);

if(return2!=ERROR_SUCCESS)

{

MessageBox("错误:无法查询有关注册表信息!");

Return;

}

//将username_Get和company_Get转换为CString字符串,以便显示输出

CString str_username=CString(username_Get);

CString str_company=CString(company_Get);

delete[] username_Get;

delete[] company_Get;

//程序结束前关闭已经打开的hKey

::RegCloseKey(hKey);

……

字符串str_username和str_company表示查询的用户的姓名和公司的名称。

2、修改用户信息的代码

因用户输出的是CString类型的字符串,要先将其转换为LPBYTE类型,以便以后函数的调用。下面是转换函数:

LPBYTE CString_To_LPBYTE(CString str)

{

LPBYTE lpb=new BYTE [str.GetLength( )+1];

for(int i=0;i

lpb[str.GetLength( )]=0;

return lpb;

}

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

CString str_username,str_company;

HKEY hKey;

LPCTSTR path=“Software\\Micrsoft\\MS Setup(ACME)\\User Info\\”;

LONG return0(::RegOpenKeyEx(HKEY_CURRENT_USER,path,0,KEY_WRITE,&hKey));

if(return0!=ERROR_SUCCESS)

{

MessageBox(“错误:无法打开有关的键!”);

return;

}

LPBYTE username_Set=Cstring_To_LPBYTE(str_username);

DWORD type_1=REG_SZ;

DWORD cbData_1=str_username.GetLength( )+1;

LONG return1=::RegSetalueEx(hKey,"DefName",NULL,type_1,username_Set,cbData_1);

if (return1!=ERROR_SUCCESS)

{

MessageBox(“错误:无法修改有关注册表信息!”);

return;

}

LPBYTE company_Set=Cstring_To_LPBYTE(str_company);

DWORD type_2=REG_SZ;

DWORD cbData_2=str_COMPANY.GetLength( )+1;

LONG return2=::RegSetalueEx(hKey,"DefCompany",NULL,type_2,company_Set,cbData_2);

if (return2!=ERROR_SUCCESS)

{

MessageBox(“错误:无法修改有关注册表信息!”);

return;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有