Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18690834
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-30 22:41:46

注册表的操作,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,    // 设置你对你建立的这个键的访问权限  [Page]
        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(\"建立一个新键\"); 

[NextPage]


   } 
   RegClosekey(m_hkey); 

  3·RegOpenKey()和RegOpenKeyEx() 
  原形:LONG RegOpenKeyEx( 
        HKEY hKey,     // 要打开主键名 
        LPCTSTR lpSubKey, // 子键或路径 
        DWORD ulOptions,  // 保留,为0  [Page]
        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));  [Page]
   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         

[NextPage]

 LPDWORD lpType,     // 返回所读取的数据类型 
        LPBYTE lpData,     // 返回所读取的数据 
        LPDWORD lpcbData    // 返回所读取的数据长度 
     ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  解释:列出某Key的所有名称的值,变化索引即可遍历整个键下的名称和数据。 

  8·RegDeleteValue() 
  原形:LONG RegDeleteValue( 
        HKEY hKey,      // 要删除的键的句柄  [Page]
        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, // 返回最长的子键长度                [Page]
        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  // 要写入注册表信息的文件 

[NextPage]


      ); 
  返回值:不成功返回非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 
  解释:从指定的文件恢复注册表键的子键信息到注册表并替换原有的值,并生成新的备份文件  [Page]

  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 
  删除注册表键及其所有的子键。 

阅读(502) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~