api注册表操作函数

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




//

//

///下面例子由我补充//

INT CControl::SetAutoRun(BOOL isAutoRun)
{
//返回true表示  成功开机运行->不运行 或者 不运行->开机运行
//失败 或者 不运行->不运行 或者 开机运行->开机运行 返回false


TCHAR path[MAX_PATH];
HKEY hSoftKey = NULL;
INT res = FALSE;


if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 
0, KEY_ALL_ACCESS, &hSoftKey))
return FALSE;


GetModuleFileName(NULL, path, MAX_PATH);

if (isAutoRun)
{
if (ERROR_SUCCESS == RegSetValueEx(hSoftKey,
TEXT("pppoe_client"),
NULL, REG_SZ, (const BYTE*)path, MAX_PATH))
res = TRUE;
}
else
{
if (ERROR_SUCCESS == RegDeleteValue(hSoftKey, TEXT("pppoe_client")))
res = TRUE;
}


FINAL:
if (hSoftKey)RegCloseKey(hSoftKey);
return res;
}




INT CControl::IsAutoRun()
{
//返回true, 表已经是开机运行的设置
//返回false, 表已在系统不是开机自运行的设置
//返回-1, 表发生其他错误


HKEY hkey = NULL;
INT res = -1;
if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),
0, KEY_ALL_ACCESS, &hkey))
res = -1;


TCHAR data[MAX_PATH] = {0};
DWORD size = MAX_PATH;
//查询注册表值
DWORD resQuery = RegQueryValueEx(hkey, TEXT("pppoe_client"), NULL, NULL, (LPBYTE)&data, &size);
//如果没有查询项, 则false
if (ERROR_FILE_NOT_FOUND == resQuery)
{
res = FALSE;
goto FINAL;
}
if (ERROR_SUCCESS == resQuery)
{
TCHAR path[MAX_PATH];
GetModuleFileName(NULL, path, MAX_PATH);
if (0 == _tcscmp(path, data))
res = TRUE;
else
{
res = FALSE;
goto FINAL;
}
}
else
res = -1;


FINAL:
if (hkey)RegCloseKey(hkey);
return res;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值