vc中注册表的一些简单操作

vc 中注册表的一些简单操作
来源于网络 http://wenda.tianya.cn/wenda/thread?tid=665a94ba8ef76419&hl=zh-CN%3Flid%3Flid http://blog.csdn.net/wblhere/article/details/2891654 整合:李强 时间:2012 年 5 月 3 日 9

注册表是 Windows 重要组成部分,注册表记录了大量有关电脑软硬件的信息。注册表中的值通过其名称标识。值名称由与键名相同的字 符组成。值本身可以是字符串、二进制数据或者是 32 位无符号值。在这里我们主要运用以下技巧:

(一) 、预定义的注册表键。注册表包含了几个预定义键: 1. HKEY_LOCAL_MACHINE 包含描述计算机及其配置的条目。 其中包括关于处理器、 系统主板、 内存和已安装的软件和硬件的信息。 2. HKEY_CLASSES_ROOT 3. HKEY_USERS 是与文档类型和 OLE/COM 相关的信息的支持键。这个键是 HKEY_LOCAL_MACHINE 的从属键。

用作默认用户首选设置,也作为单个用户的首选设置。 是用于当前(登录)用户的相关信息。

4. HKEY_CLASSES_USER

5. HKEY_CURRENT_CONFIG 包含了当前系统配置的信息。 6. 还有一个,一般不会出现,只有配置的局域网后才会有。

(二) 、VC 中两种注册表操作方法

在 VC 中,主要有两种方法可以实现注册表的操作,一是使用 MFC 封装的类 CRegKey,该类包含了 14 个成员函数,它们可以实现注 册表的简单操作(基本的如本文提到的“打开、创建、读、写、关闭”等) ;二是使用 Windows API 函数。当然,对我来说,能使用底层的, 那为什么不用呢,毕竟我现在是程序员,使用底层函数,可以移植到更多的开发*台中嘛。

1. 所需要头文件:atlbase.h 该种方法可以使用类 CRegKey 中的成员函数来完成。先包含头文件,再申明一个类对象 CRegKey RKey;然后就可以调用成员函数 来操作了。 基本功能的成员函数: LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName,REGSAM samDesired = KEY_ALL_ACCESS); LONG Close(); LONG Create(HKEY hKeyParent, LPCTSTR lpszKeyName, LPTSTR lpszClass = REG_NONE, DWORD dwOptions = REG_OPTION_NON_VOLATILE, REGSAM samDesired = KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTES lpSecAttr = NULL, LPDWORD lpdwDisposition = NULL); LONG SetValue(DWORD dwValue, LPCTSTR lpszValueName); LONG SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL); LONG QueryValue(DWORD& dwValue, LPCTSTR lpszValueName); LONG QueryValue(LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount);

其他几个: LONG SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL); static LONG WINAPI SetValue(HKEY hKeyParent, LPCTSTR lpszKeyName,LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL);

HKEY Detach(); void Attach(HKEY hKey); LONG DeleteSubKey(LPCTSTR lpszSubKey); LONG RecurseDeleteKey(LPCTSTR lpszKey); LONG DeleteValue(LPCTSTR lpszValue);

但是本文主要介绍使用 Windows API 函数来操作注册表,所以这里不详细的介绍这些成员函数的用法了。

2. Windows API 函数个数比较多,一共有三、四十个,这里主要介绍几个常用的函数,来实现本文所说的基本功能即可。

常用 API 函数

☆ 打开一个键的函数:RegOpenKeyEx 函数定义:LONG RegOpenKeyEx(HKEY hKey,//已经打开的键的句柄,或者直接是上述几个根键 LPCTSTR lpSubKey,//要打开的子键名字的地址 DWORD ulOptions,//保留值,必须为 0 REGSAM samDesired,//打开方式,如读还是写 PHKEY phkResult//返回的打开的子键的句柄 ); 各参数及返回值的含义如下: ?参数 hKey 的含义同 RegCreateKeyEx 函数中的 hKey 参数。 ?参数 lpSubKey 为一个指向以零结尾的字符串的指针,其中包含子键的名称,可以利用反斜线()分隔不同的子键名。如果字符串 为空,则根据 hKey 参数创建一个新的句柄。在这种情况下,并不关闭先前打开的句柄。 ?ulOption 保留,通常必须设置为 0。 ?参数 samDesired 的含义同 RegCreateKeyEx 函数中的 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 准许设置子键的数值

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

说明:如果指定的要打开的子键不存在,则返回失败;反之返回成功 ERROR_SUCCESS;

☆ 创建一个键的函数:RegCreateKeyEx

函数定义:LONG RegCreateKeyEx(HKEY hKey,//已经打开的键的句柄,或者直接是上述几个根键 LPCTSTR lpSubKey,//要创建的子键名字的地址 DWORD ulOptions,//保留值,必须为 0 REGSAM samDesired,//打开方式,如读还是写 PHKEY phkResult//返回的创建的子键的句柄 ); 说明:如果指定的要创建的子键已经存在,则打开该子键;反之创建该子键。函数成功则返回 ERROR_SUCCESS; 该子键可以一次创建多层子键,格式为“子键 1 层//子键 2 层//子键 3 层。。” 。 各参数及返回值的含义如下: ?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 函数来获取一个对错误的总体描述。

☆ 查询某一个键值:RegQueryValueEx 函数定义:LONG RegQueryValueEx(HKEY hKey,//要查询的键的句柄 LPCTSTR lpValueName,//要查询的键值的名称 LPDWORD lpReserved,//保留值,必须为 0 LPDWORD lpType,//要查询的数据的类型,如果不关心,可以为 NULL LPBYTE lpData,//要返回的查询的数据 LPDWORD lpcbData//预置的数据的长度,理论上可以为 NULL,但实际我发现不行,最好设一个值 );

☆ 设置一个键值 RegSetValueEx 函数定义:LONG RegSetValueEx(HKEY hKey,//要设置的键的句柄 LPCTSTR lpValueName,//要访问的键值的名称 LPDWORD lpReserved,//保留值 DWORD dwType,//要设置的数据的类型 const BYTE *lpData,//要设置的健值 DWORD cbData//数据的长度 ); 说明:如果要写入的数据已经存在,只是改变值而已;如果不存在,则新建子键并存值。

二、例子

我做了一些注册表的简单操作,主要是打开,如果打开失败,则创建;然后存值;

HKEY key; CString strName = "hello"; CString strCompany = "world"; CString strSeries = "1111-1111"; bool G_bIsLicesed = true;

if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software//my Application//Settings"), 0, KEY_ALL_ACCESS, &hkey)!= ERROR_SUCCESS) { VERIFY(!RegCreateKey(HKEY_CURRENT_USER, _T("Software//my Application//Settings"), &hkey)); }

VERIFY(!RegSetValueEx(hkey, _T("LicesedBool"), 0, REG_DWORD, (BYTE *)&G_bIsLicesed, 4)); VERIFY(!RegSetValueEx(hkey, _T("User Name"), 0, REG_SZ, (BYTE *)strName.GetBuffer(strName.GetLength()), 50)); VERIFY(!RegSetValueEx(hkey, _T("Company Name"), 0, REG_SZ, (BYTE *)strCompany.GetBuffer(strCompany.GetLength()),25)); VERIFY(!RegSetValueEx(hkey, _T("License Code"), 0, REG_SZ, (BYTE *)strSeries.GetBuffer(strSeries.GetLength()), 20)); RegCloseKey(hkey);

另外,我还做了注册表的读取操作

unsigned char chbuf[50]; CString strCompany = ""; CString strSeries = ""; HKEY hkey; DWORD type(0); DWORD len(50); memset(chbuf, 0, sizeof(chbuf));

if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software//my Application//Settings"), 0, KEY_ALL_ACCESS, &hkey) == ERROR_SUCCESS) { if (RegQueryValueEx(hkey, _T("User Name"), 0, &type, chbuf, &len) == ERROR_SUCCESS) { ; } if (!RegQueryValueEx(hkey, _T("Company Name"), 0, &type, chbuf, &len)) { strCompany.Format("%s", chbuf); } if (!RegQueryValueEx(hkey, _T("License Code"), 0, &type, chbuf, &len)) { strSeries.Format("%s", chbuf); } if (!RegQueryValueEx(hkey, _T("LicesedBool"), 0, &type, chbuf, &len)) { G_bIsLicesed = chbuf[0]; }

RegCloseKey(hkey); }

下面我们在 Visual C++6.0 或 5.0 环境中新建一基于对话框的工程。设置两个命令按钮,名为“查询用户信息”和“修改用户信息” , 用 来 查 询 和 修 改 注 册 表 中 的 用 户 姓 名 和 公 司 名 称 。 需 要 说 明 的 是 , 用 户 的 信 息 位 于 系 统 注 册 表 中 KEY - CURRENT - USERSoftwareMicrsoftMS 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<STR. GetLength( );i++)lpb[i]="str[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; }


相关文档

  • VC中简单操作注册表
  • [VC++]注册表简单操作
  • VC++文件、注册表操作
  • vc注册表操作
  • VC++注册表操作
  • 用VC++操作注册表
  • VC中注册表的应用
  • 对注册表进行简单的操作
  • C_注册表的简单操作
  • vc注册表
  • 电脑版