WindowsAPI 注册表函数总结

本文详细介绍Windows注册表操作API,涵盖25个核心函数,包括读取、写入、删除等功能,以及如何正确使用这些函数避免系统问题。

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

 

删除例子
HKEY hKey;
LONG lRes;
lRes= RegOpenKeyEx(HKEY_LOCAL_MACHINE,m_szAU,0,KEY_WRITE,&hKey);
if( lRes != ERROR_SUCCESS )
{
}else{
RegDeleteValue(hKey,m_szAUOptions);
RegCloseKey(hKey);
gLogger.debug("[ApplyWorker]Del Key AUOptions");
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值