VC操作注册表

注册表的操作,API为我们提供了大约25个函数。他提供了对注册表的读取,写入,删除,以及打开注

册表及键值时所有函数,并且可以达到对注册表的备份,连接和对远端注册表进行查看等等。注册表对

整个系统十分重要,你在进行操作时,一定要先考虑清楚。这些函数有:

RegCloseKey RegConnectRegistry    RegCreateKey    RegCreateKeyEx    RegDeleteKey    RegDeleteVale  

RegEnumKey    RegFlushKey    RegGetKeySecurity(此函数,98不适用)    RegLoadKey

RegNotifyChangeKeyValue(98不适用)    RegOpenKey    RegOpenKeyEx    RegQueryInfoKey  

RegQueryValue

RegQueryValueEx    RegReplaceKey    RegRestoreKey(98不适用) RegSaveKey    RegSetKeySecurity

(98不适用)     RegSetValue    RegSetValueEx    RegUnLoadKey  

    我们对经常使用的几个函数进行介绍。

    1·RegClose()

    原形:LONG RegCloseKey(

    HKEY hKey    // 释放已经打开的注册表句柄

       );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    解释:关闭指定的主册表键,释放句柄。当对一个或多个键或值操作完成以后,需要关闭其键来进行

保存操作结果。关闭一个键后,句柄变为非法,以使其不可再次被使用。为系统重新使用而释放句柄。

    例子

BOOL bRet = TRUE;

if( m_hKey == NULL )

    return( FALSE );

bRet = ( ::RegCloseKey( m_hKey ) == ERROR_SUCCESS );

m_hKey = NULL;

return( bRet );

    2·RegCreateKeyEx()和RegCreateKey()

    原形:LONG RegCreateKeyEx(

          HKEY hKey,          // 主键名称

          LPCTSTR lpSubKey,       // 子键名称或路径

          DWORD Reserved,        // 保留,为0

          LPTSTR lpClass,        // 没弄懂,我设为空也差不多

          DWORD dwOptions,      

               /* 对你建立的键的一些选项,可以是这些值:REG_OPTION_NON_VOLATILE,

REG_OPTION_VOLATILE,REG_OPTION_BACKUP_RESTORE第一个是默认的了。一般用第一个就可以了。*/

          REGSAM samDesired,      // 设置你对你建立的这个键的访问权限

          LPSECURITY_ATTRIBUTES lpSecurityAttributes,

               //不太明白

          PHKEY phkResult,       // 指向你建的句柄

          LPDWORD lpdwDisposition    //用来查看是打开一个已经有的键,还是新建了键

        );

    RegCreateKey()函数简单了不少,请自己看了。

    返回值:不成功返回非0,成功返回ERROR_SUCCESS.

    解释:打开指定的键或子键。如果要打开的键不存在的话,本函数会试图建立它。当在创建或打开注

册表的键时,需要指定访问权限,而这些访问权限需要到一级。默认的权限是KEY_ALL_ACCESS权限。还

有KEY_CREATE_LINK创建字符链权限,KEY_CREATE_SUB_KEY创建子键权限,KEY_EXECUTE读取键权限,

KEY_NOTIFY获得修改键通知的权限,KEY_QUERY_VALUE查询键值的权限,KEY_SET_VALUE设置数据值的权

限。注意不能在根一级建键,在注册表的根一级仅可有预定义的键。具体使用,请查看联机手册。

例子:

     HKEY m_hkey;

     DWORD dwDisposition;

     long ret0=(::RegCreateKeyEx

        (HKEY_CURRENT_USER,"REGD/",0,NULL,

        REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&m_hkey,&dwDisposition));

     if(ret0!=ERROR_SUCCESS) //如果无法打开hKEY,则终止程序的执行

     {

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

        return;

     }

     if(dwDisposition==REG_OPENED_EXISTING_KEY)

        MessageBox("打开了一个已经存在的键");

     else

     {

       if(dwDisposition==REG_CREATED_NEW_KEY)

          MessageBox("建立一个新键");

     }

     RegClosekey(m_hkey);

    3·RegOpenKey()和RegOpenKeyEx()

    原形:LONG RegOpenKeyEx(

          HKEY hKey,       // 要打开主键名

          LPCTSTR lpSubKey, // 子键或路径

          DWORD ulOptions,    // 保留,为0

          REGSAM samDesired, // 操作权限标志

          PHKEY phkResult    // 指向你打开键的句柄

        );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS.

    解释:该函数负责打开指定的键或子键,如果不存在他不建立。其他和RegCreateKeyEx()和

RegCreateKey()基本相同。

    4·RegDeleteKey()

    原形:LONG RegDeleteKey(

          HKEY hKey,       // 已打开的键的句柄

          LPCTSTR lpSubKey    // 要删除的子键或路径,传如""将删除key本身

         );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    该函数用来删除注册表中的一个键值的。在用此函数时需要注意98与NT的差异。在NT中在删除一个键

之前,要求必须删除所有子键,需要从下向上递归删除所有子键,而WINDOWS98没有他那么复杂,只要

删除键及其所有子键就可以啦。

    5·RegQueryValue()和RegQueryValueEx()

    原形:LONG RegQueryValueEx(

          HKEY hKey,        // 已打开的键的句柄

          LPTSTR lpValueName, // 要查询值的名称,传如""为查询键下的默认值

          LPDWORD lpReserved, // 保留,为0

          LPDWORD lpType,     // 查询的类型

          LPBYTE lpData,      // 数据存放的地址

          LPDWORD lpcbData     // 数据长度+1

        );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    解释:读取某子键下特定名称的值。

    例子

     CString m_strQ;//用来存放查询来的字符串值

     DWORD m_dwCount;//记录字符串的长度+1(包括NULL字符)

     ::RegQueryValueEx(m_hkey,"",0,NULL,NULL,&m_dwCount);//先查询出字节空间  

     ret1=(::RegQueryValueEx

          (m_hkey,"",0,NULL,(unsigned char *)m_strQ.GetBuffer(m_dwCount),&m_kk));

     m_strQ.ReleaseBuffer();

     MessageBox(m_strQ);

    6·RegSetValue()和RegSetValueEX()

    原形:LONG RegSetValueEx(

          HKEY hKey,        // 已打开的键的句柄

          LPCTSTR lpValueName, // 要查询值的名称,传如""为查询键下的默认值

          DWORD Reserved,     // 保留

          DWORD dwType,      // 变量的类型

          CONST BYTE *lpData, // 变量数据的地址

          DWORD cbData       // 变量的长度

        );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    解释:设置某子键下特定名称的值。

    7·RegEnumValue()

    原形:LONG RegEnumValue(

          HKEY hKey,         // 要查询的已打开的键的句柄

          DWORD dwIndex,       // 读取名称的索引号

          LPTSTR lpValueName,     // 返回所读取的名称

          LPDWORD lpcbValueName, // 返回读取名称的长度,不含chr(0)

          LPDWORD lpReserved,     // 保留,为0

          LPDWORD lpType,       // 返回所读取的数据类型

          LPBYTE lpData,       // 返回所读取的数据

          LPDWORD lpcbData      // 返回所读取的数据长度

       );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    解释:列出某Key的所有名称的值,变化索引即可遍历整个键下的名称和数据。

    8·RegDeleteValue()

    原形:LONG RegDeleteValue(

          HKEY hKey,        // 要删除的键的句柄

          LPCTSTR lpValueName    // 要删除的名称

        );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    解释:删除某Key的某一名称

    9·RegEnumKey()和RegEnumKeyEx()

    原形:LONG RegEnumKeyEx(

          HKEY hKey,       // 要列举的键的句柄

          DWORD dwIndex,     // 索引

          LPTSTR lpName,     // 子键的名称

          LPDWORD lpcbName,    // 子键名称的长度

          LPDWORD lpReserved, // 保留

          LPTSTR lpClass,     // address of buffer for class string

          LPDWORD lpcbClass, // address for size of class buffer

          PFILETIME lpftLastWriteTime

             // address for time key last written to

        );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    返回注册表键及其子键的详细信息。

    10·RegQueryInfoKey()

    原形:LONG RegQueryInfoKey(

          HKEY hKey,          // 已打开的键的句柄

          LPTSTR lpClass,        // 类型名称,仅使用于NT。若不使用则传入Null

          LPDWORD lpcbClass,      // 类型名称的长度

          LPDWORD lpReserved,      // 保留

          LPDWORD lpcSubKeys,      // 返回子键的数目               

          LPDWORD lpcbMaxSubKeyLen, // 返回最长的子键长度               

          LPDWORD lpcbMaxClassLen, // 返回最长的类长度

          LPDWORD lpcValues,      // 返回值的数目               

          LPDWORD lpcbMaxValueNameLen, // 返回最长的值项名称的长度

          LPDWORD lpcbMaxValueLen, // 返回最长的值的长度

          LPDWORD lpcbSecurityDescriptor, //返回安全描述,仅适用于 NT

          PFILETIME lpftLastWriteTime    // 返回键最后被写入的时间,仅适用于 NT

       );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    解释:返回注册表键的信息,包括类名、子键数量、最长子键名、值的数量、最长值数据、安全描述

符的长度以及上一次写入的时间等。

    11·RegLoadKey()

    原形:LONG RegLoadKey(

          HKEY hKey,      // 打开的句柄

          LPCTSTR lpSubKey, //子键的路径          

          LPCTSTR lpFile    // 要写入注册表信息的文件

        );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    解释:从指定的文件恢复注册表键的子键信息到注册表。

    12·RegReplaceKey()

    原形:LONG RegReplaceKey(

          HKEY hKey,       // handle to open key

          LPCTSTR lpSubKey, // address of name of subkey

          LPCTSTR lpNewFile, // 在替换前生成新的备份文件

          LPCTSTR lpOldFile // 需要覆盖上注册表的文件

        );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    解释:从指定的文件恢复注册表键的子键信息到注册表并替换原有的值,并生成新的备份文件

    13· RegSaveKey()

    LONG RegSaveKey(

       HKEY hKey,      // 要保存的句柄

       LPCTSTR lpFile, // 保存子键的文件

       LPSECURITY_ATTRIBUTES lpSecurityAttributes      //不太懂          

      );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    解释:保存键及其子键信息到指定的文件。

    14· RegConnectRegistry()

    原形:LONG RegConnectRegistry(

          LPTSTR lpMachineName, //远程计算机的名称

          HKEY hKey,      // 预先注册的句柄

          PHKEY phkResult    // 远程计算机上的句柄

       );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    解释:连接到远程系统的注册表。

    15·RegNotifyChangeKeyValue()

    当修改指定的注册表对象时提供通知。

    16· RegUnloadKey()

    LONG RegUnLoadKey(

       HKEY hKey,       // handle to open key

       LPCTSTR lpSubKey    // address of name of subkey to unload

      );

    返回值:不成功返回非0,成功返回ERROR_SUCCESS

    删除注册表键及其所有的子键。

 

如今修改注册表成为继超频之后的又一大热点,许多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;
  }

 

 

下面是一个封装类的实现源码:

#pragma once
const UINT BUFFER_LENGTH = 1024;
const UINT BUFFER_LENGTH_BINARY = 3;
enum err 
{  
 ERR_OPENREGKEY,
 ERR_SETREGVALUE,
 ERR_QUERYVALUE,
 ERR_DELETEVALUE,
 ERR_SUBKEYEXIST,
 ERR_CREATESUBKEY,
 ERR_DELETESUBKEY,  
 ERR_SUCCESS,
 ERR_KEYNOTEXIST
};
enum hkey
{
 DHKEY_CLASSES_ROOT = 0x80000000,
 DHKEY_CURRENT_USER = 0x80000001,
 DHKEY_LOCAL_MACHINE = 0x80000002,
 DHKEY_USERS = 0x80000003,
 DHKEY_CURRENT_CONFIG = 0x80000005
};
class CRegeditOp
{
public:
 CRegeditOp();
 virtual ~CRegeditOp();
public:
 //Set or modify the type and value of the key
 err SetStrValue(HKEY hMainKey, CString szSubKey, CString szItem,  CString szValue);
 //query the value and the type of the key
 err GetStrValue(HKEY hMainKey, CString szSubKey, CString szItem, CString& szValue, DWORD& strType,DWORD& length);
 //delete the key value
 err DeleteStrValue(HKEY hMainKey, CString szSubKey, CString szItem);
 //create a sub key
 err AddSubKey(HKEY hMainKey, CString szSubKey);
 //delete a sub key
 err DeleteSubKey(HKEY hMainKey, CString szSubKey);
 //check the specified key path wheather exist
 err CheckRegeditFoler(HKEY hMainKey, CString szSubKey);
};

实现文件

#include "StdAfx.h"
#include "RegeditOp.h"
#include "./regeditop.h"
#include "MyFile.h"

CRegeditOp::CRegeditOp(void)
{
}

CRegeditOp::~CRegeditOp(void)
{
}

/**************************************************************************
* Name    : SetStrValue
* Function: set the value of the stecial key
* Input   : 
      hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
           HKEY_CLASSES_ROOT
     HKEY_CURRENT_USER
     HKEY_LOCAL_MACHINE
     HKEY_USERS
   szSubKey:The path of the key which is going to be setted.
   szItem:The name of the key which is going to be setted
   szValue:The value of the key which is going to be setted 
* Output  : 
* In&Out  :
* Return  : IF success, return ERR_SUCCESS(7);if open key failed, return  ERR_OPENREGKEY(0);If set value failed, return ERR_SETREGVALUE(1)
* Others  : 
* Date        Version       People Name     Content of modify
* -----------------------------------------------------------
* 2008-8-4    V1.0         jet             Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::SetStrValue(HKEY hMainKey, CString szSubKey, CString szItem,  CString szValue)
{
 HKEY hRsltKey;

 //=========================================打开注册表
 long lRslt = RegOpenKeyEx(hMainKey, szSubKey, 0,KEY_SET_VALUE,&hRsltKey);
 if (lRslt != ERROR_SUCCESS)
 {   
  return ERR_OPENREGKEY;
 }

 //===================================设置注册表值
 lRslt = RegSetValueEx(hRsltKey, 
       szItem, 
       NULL, 
       REG_SZ,
       LPBYTE(szValue.GetBuffer(szValue.GetLength())), 
       szValue.GetLength());
 if (lRslt != ERROR_SUCCESS)
 {   
  return ERR_SETREGVALUE;
 }

 //============================================关闭注册表键
 if (hMainKey)
 {
  RegCloseKey(hMainKey);
 }
 if (hRsltKey)
 {
  RegCloseKey(hRsltKey);
 }
 return ERR_SUCCESS;
}


/**************************************************************************
* Name    : GetStrValue
* Function: Query the key value and type of the specify key.
* Input   : 
      hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
           HKEY_CLASSES_ROOT
     HKEY_CURRENT_USER
     HKEY_LOCAL_MACHINE
     HKEY_USERS
   szSubKey:The path of the key which is going to be got.
   szItem:The name of the key which is going to be got.   
   
* Output  : szValue:A string parameter that receives the value's #
   strType:A DWORD parameter that receives the value's type
* In&Out  : length:[IN]  A DWORD parameter that spcify the value's length,if the length is smaller than the the real key length, the keyValue cann't be ruturn.
          [OUT] A DWORD parameter that receives the value's length
* Return  : IF success, return ERR_SUCCESS(7);if open key failed, return  ERR_OPENREGKEY(0);If set value failed, return ERR_SETREGVALUE(1)
* Others  : 
* Date        Version       People Name     Content of modify
* -----------------------------------------------------------
* 2008-8-4    V1.0         jet             Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::GetStrValue(HKEY hMainKey, CString szSubKey, CString szItem, CString& szValue, DWORD &strType,DWORD& length)
{  
 HKEY hRsltKey;
 //打开注册表
 if (ERROR_SUCCESS != RegOpenKeyEx(hMainKey, szSubKey,0,KEY_READ, &hRsltKey))
 {   
  return ERR_OPENREGKEY;
 }
 LPBYTE lp# = new BYTE[length];
 memset(lp#,0,length);
 //查询注册表项值
 long lRslt = RegQueryValueEx(hRsltKey, szItem, 0, &strType, lp#,&length);
 szValue = (CString)lp#; 
 
 if (lRslt != ERROR_SUCCESS)
 {   
  delete [] lp#;
  return ERR_QUERYVALUE;
 } 
 delete [] lp#;
 //关闭打开的键
 if (hMainKey)
 {
  RegCloseKey(hMainKey);
 }
 if (hRsltKey)
 {
  RegCloseKey(hRsltKey);
 }
 return ERR_SUCCESS;
}

/**************************************************************************
* Name    : AddSubKey
* Function: Add a new key
* Input   : 
      hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
           HKEY_CLASSES_ROOT
     HKEY_CURRENT_USER
     HKEY_LOCAL_MACHINE
     HKEY_USERS
   szSubKey:The path of the key which is going to be created.
      
* Output  : 
* In&Out  : 
* Return  : If success, return ERR_SUCCESS(7);if the key was exist, return ERR_SUBKEYEXIST(4);if create key failed, return  ERR_CREATESUBKEY(5)
* Others  : 
* Date        Version       People Name     Content of modify
* -----------------------------------------------------------
* 2008-8-4    V1.0         jet             Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::AddSubKey(HKEY hMainKey, CString szSubKey)
{
 HKEY hRsltKey;
 //================================判断要增加的注册表子键是否已存在
 //LONG iReturn = RegOpenKeyEx(hMainKey, szSubKey, 0,0,&hRsltKey);
 if (ERROR_SUCCESS == RegOpenKeyEx(hMainKey, szSubKey,0,KEY_SET_VALUE,&hRsltKey))
 {  
  return ERR_SUBKEYEXIST;
 }

 //==================================如果不存在,则增加此子键
 long lRslt = RegCreateKeyEx(hMainKey, szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_CREATE_SUB_KEY ,NULL, &hRsltKey,NULL);
 //long lRslt = RegCreateKey(hMainKey,szSubKey, &hRsltKey);

 if (lRslt != ERROR_SUCCESS) 
 {  
  return ERR_CREATESUBKEY;  
 }

 //===============================关闭打开的注册表键句柄
 if(hMainKey)
 {
  RegCloseKey(hMainKey);
 }
 if (hRsltKey) 
 {
  RegCloseKey(hRsltKey);
 }
 return ERR_SUCCESS;

/**************************************************************************
* Name    : DeleteStrValue
* Function: Delete the value of a key
* Input   : 
      hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
           HKEY_CLASSES_ROOT
     HKEY_CURRENT_USER
     HKEY_LOCAL_MACHINE
     HKEY_USERS
   szSubKey:The path of the key which value is going to be deleted.
   szItem:The key which to be deleted.      
* Output  : 
* In&Out  : 
* Return  : If success, return ERR_SUCCESS(7);if open key failed, return ERR_OPENREGKEY(0);if delete key value failed, return  ERR_DELETEVALUE(3)
* Others  : 
* Date        Version       People Name     Content of modify
* -----------------------------------------------------------
* 2008-8-4    V1.0         jet             Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::DeleteStrValue(HKEY hMainKey, CString szSubKey, CString szItem)
{
 HKEY hRsltKey;
 //打开注册表
 long lRslt = RegOpenKeyEx(hMainKey, szSubKey,0,KEY_CREATE_SUB_KEY, &hRsltKey);
 if (lRslt != ERROR_SUCCESS)
 {  
  return ERR_OPENREGKEY;
 }
 //删除注册表项
 lRslt = RegDeleteValue(hRsltKey, szItem);
 if (lRslt != ERROR_SUCCESS)
 {  
  return ERR_DELETEVALUE;
 }
 return ERR_SUCCESS;
}

/**************************************************************************
* Name    : DeleteSubKey
* Function: Delete a key
* Input   : 
      hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
           HKEY_CLASSES_ROOT
     HKEY_CURRENT_USER
     HKEY_LOCAL_MACHINE
     HKEY_USERS
   szSubKey:The path of the key which is going to be deleted.    
* Output  : 
* In&Out  : 
* Return  : If success, return ERR_SUCCESS(7);if delete key failed, return  ERR_DELETESUBKEY(3)
* Others  : 
* Date        Version       People Name     Content of modify
* -----------------------------------------------------------
* 2008-8-4    V1.0         jet             Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::DeleteSubKey(HKEY hMainKey, CString szSubKey)
{
 //=================================删除子键
 long lRslt = RegDeleteKey(hMainKey, szSubKey);
 if (lRslt) 
 {  
  return ERR_KEYNOTEXIST;
 }

 //关闭打开的键
 if (hMainKey)
 {
  RegCloseKey(hMainKey);
 }
 return ERR_SUCCESS;
}

/**************************************************************************
* Name    : CheckRegeditFoler
* Function: Check wheathe the specified Key path is exist.
* Input   : 
      hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
           HKEY_CLASSES_ROOT
     HKEY_CURRENT_USER
     HKEY_LOCAL_MACHINE
     HKEY_USERS
   szSubKey:The path of the key which is going to be checked.    
* Output  : 
* In&Out  : 
* Return  : If success, return ERR_SUCCESS(7);if delete key failed, return  ERR_DELETESUBKEY(3)
* Others  : 
* Date        Version       People Name     Content of modify
* -----------------------------------------------------------
* 2008-8-4    V1.0         jet             Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::CheckRegeditFoler(HKEY hMainKey, CString szSubKey)
{
 HKEY hRsltKey;
 //打开注册表
 if (ERROR_SUCCESS == RegOpenKeyEx(hMainKey, szSubKey,0,KEY_READ, &hRsltKey))
 {  
  if(hMainKey)
  {
   RegCloseKey(hMainKey);
  }
  if (hRsltKey) 
  {
   RegCloseKey(hRsltKey);
  }
  return ERR_SUCCESS;
 }
 else
 {
  return FALSE;
 }
}

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值