VC 注册表操作

时间:2021-11-29 05:00:30

1.打开已经存在的键:

LONG RegOpenKeyEx(

  HKEY hKey, // 需要打开的主键的名称

  LPCTSTR lpSubKey, //需要打开的子键的名称

  DWORD ulOptions, // 保留,设为0

  REGSAM samDesired, // 安全访问标记,也就是权限

  PHKEY phkResult // 得到的将要打开键的句柄

);

参数意义:

hKey  [输入] 当前打开或者以下预定义的键。 lpSubKey  [输入] 指向一个非中断字符串包含将要打开键的名称。如果参数设置为NULL 或者指向一个空字符串,过程将打开一个新的句柄由hKey参数确定的值。这种情况下,过程不会关闭先前已经打开的句柄。  ulOptions  保留,必须设置为 0samDesired  [输入] 对指定键希望得到的访问权限的访问标记。phkResult  [输出] 指向一个被打开键返回的句柄的指针。当不再需要句柄,必须调用 RegCloseKey 关闭它。返回值:  如果过程执行成功,返回值是 ERROR_SUCCESS。  如果功能失败,返回一个非零值,错误码在 Winerror.h 定义。可以使用 FormatMessage 函数 和 FORMAT_MESSAGE_FROM_SYSTEM 标记获得一个分类的错误描述。

 

2.创建新的键

LONG WINAPI RegCreateKey(

  __in      HKEY hKey,

  __in_opt  LPCTSTR lpSubKey,

  __out     PHKEY phkResult

);

参数意义参考RegOpenKeyEx 。

3.获取和设置键值:

LONG WINAPI RegGetValue(   //从注册表中取出一个值

  __in         HKEY hkey,

  __in_opt     LPCTSTR lpSubKey,

  __in_opt     LPCTSTR lpValue,

  __in_opt     DWORD dwFlags,

  __out_opt    LPDWORD pdwType,

  __out_opt    PVOID pvData,

  __inout_opt  LPDWORD pcbData

);

LONG RegSetValueEx(     //设置注册表值
    HKEY hKey, 
    LPCTSTR lpValueName, 
    DWORD Reserved, 
    DWORD dwType, 
    CONST BYTE *lpData, 
    DWORD cbData 
);

4.删除键值:

LONG RegDeleteValue(
    HKEY hKey, //待打开的预定义键
    LPCTSTR lpSubKEY //欲删除的键名
);

5.删除键:

LONG WINAPI RegDeleteKeyEx(

  __in        HKEY hKey,

  __in        LPCTSTR lpSubKey,

  __in        REGSAM samDesired,

  __reserved  DWORD Reserved

);

6.重命名键:

NTSTATUS NtRenameKey(

  __in  HANDLE KeyHandle,  //需要重命名的键,键的打开方式必须有KEY_WRITE权限

  __in  PUNICODE_STRING NewName  //键的新名字,只是键的新名字,不需要带路径

);

说明:使用NtRenameKey函数并不在头文件中,使用它需要引用“Ntdll.lib” 。

7.列举注册表项及键值

LONG RegEnumKeyEx(  //枚举指定项下方的子项

  HKEY hKey,

  DWORD dwIndex,

  LPWSTR lpName,

  LPDWORD lpcName,

  LPDWORD lpReserved,

  LPWSTR lpClass,

  LPDWORD lpcbClass,

  PFILETIME lpftLastWriteTime

);

LONG WINAPI RegEnumValue(  //枚举指定项的值

  __in         HKEY hKey,

  __in         DWORD dwIndex,

  __out        LPTSTR lpValueName,

  __inout      LPDWORD lpcchValueName,

  __reserved   LPDWORD lpReserved,

  __out_opt    LPDWORD lpType,

  __out_opt    LPBYTE lpData,

  __inout_opt  LPDWORD lpcbData

);

LONG RegQueryInfoKey(  //获取与一个项有关的信息

  HKEY hKey,

  LPWSTR lpClass,

  LPDWORD lpcbClass,

  LPDWORD lpReserved,

  LPDWORDlpcSubKeys,

  LPDWORD lpcbMaxSubKeyLen,

  LPDWORD lpcbMaxClassLen,

  LPDWORD lpcValues,

  LPDWORD lpcbMaxValueNameLen,

  LPDWORD lpcbMaxValueLen,

  LPDWORD lpcbSecurityDescriptor,

  PFILETIME lpftLastWriteTime

);

8.关闭注册表键:

LONG RegCloseKey(

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

);

示例代码:

创建注册表键值:

DWORD SetRegistry(char *szRegPort, char *szKey, char *szValue)
{
    char    ValueName[128];
    HKEY    hkPort;
    DWORD    cbData = 256;
    DWORD    retCode, dwDisp;
    if ((retCode=RegCreateKeyEx(HKEY_LOCAL_MACHINE, szRegPort, 0, NULL, REG_OPTION_NON_VOLATILE,
                                KEY_ALL_ACCESS, NULL, &hkPort, &dwDisp)) == ERROR_SUCCESS)
    {
        lstrcpy(ValueName, szKey);
        retCode = RegSetValueEx(hkPort,                    // Key handle returned from RegOpenKeyEx.
                                ValueName,                // Name of value.
                                0,                        //reserved , must be null
                                REG_SZ,                    // Type of data.
                                (PBYTE)szValue,            // Data buffer.
                                strlen(szValue));        // Size of data buffer.
        RegCloseKey(hkPort);
    }
    return retCode;
}

查询注册表键:

DWORD QueryRegistry(char *szRegPort, char *szKey, char *szValue)
{
    char    ValueName[128];
    HKEY    hkPort;
    BYTE    bData[256];  // in registry the max length is banner user name
    DWORD    cbData = 256;
    DWORD    retCode;
    DWORD    dwType=REG_SZ;
    if ((retCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szRegPort, 0, KEY_EXECUTE, &hkPort)) == ERROR_SUCCESS)
    {
        lstrcpy(ValueName, szKey);
        retCode = RegQueryValueEx (hkPort,                // Key handle returned from RegOpenKeyEx.
                                ValueName,                // Name of value.
                                NULL,                    //reserved , must be null
                                &dwType,                // Type of data.
                                bData,                    // Data buffer.
                                &cbData);                // Size of data buffer.
        if (retCode == ERROR_SUCCESS)
        {
            strcpy(szValue,(const char*)bData);
        }
        RegCloseKey(hkPort);
    }
    return retCode;
}

注册表实现开机自启动:

//写入注册表,开机自启动 
HKEY hKey; 
//找到系统的启动项 
LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run"; 
//打开启动项Key 
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey); 
if(lRet == ERROR_SUCCESS) 

    char pFileName[MAX_PATH] = {0}; 
    //得到程序自身的全路径 
    DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH); 
    //添加一个子Key,并设置值 
    lRet = RegSetValueEx(hKey, "WorkAssist", 0, REG_SZ, (BYTE *)pFileName, dwRet); 
    //关闭注册表 
    RegCloseKey(hKey); 
    if(lRet != ERROR_SUCCESS) 
    { 
        AfxMessageBox("系统参数错误,不能随系统启动"); 
    } 
}  

 

 

VC中注册表操作精华

1.查看注册表
       HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
       LPCTSTR data_Set = "Software\\Microsoft\\Windows\\CurrentVersion\\";
       //1表示根鍵的位置2表示打开的地方3必须为ZEOR4表示打开方式5....
       long ret0 = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKEY);
       if(ret0 != ERROR_SUCCESS) //如果无法打开hKEY,则终止程序
       {
             MessageBox("错误:无法打开有关的HKEY");
             return;
       }
       //查询有关的数据(这里表示用户名
       LPBYTE owner_Get = new BYTE[80];
       DWORD type_1 = REG_SZ;
       DWORD cbData_1 = 80;
       long ret1 = ::RegQueryValueEx(hKEY, "CommonFilesDir", NULL, &type_1, owner_Get, &cbData_1);
       if(ret1 != ERROR_SUCCESS)
       {
             MessageBox("错误,无法查询有关注册表的信息");
             return;
       }
       CString strname;
       strname = CString(owner_Get);
       MessageBox(strname);
       delete[] owner_Get;
       ::RegCloseKey(hKEY);

2.修改注册表
       HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
       LPCTSTR data_Set = "Software\\Microsoft\\Windows\\CurrentVersion\\";
       //1表示根鍵的位置2表示打开的地方3必须为ZEOR4表示打开方式5....
       long ret0 = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKEY);
       if(ret0 != ERROR_SUCCESS) //如果无法打开hKEY,则终止程序
       {
             MessageBox("错误:无法打开有关的HKEY");
             return;
       }
       //查询有关的数据(这里表示用户名
       LPBYTE owner_Set = 你已取出鍵值的内容
       DWORD type_1 = REG_SZ;
       DWORD cbData_1 = 你取出键的长度+1
       long ret1 = ::RegSetValueEx(hKEY, "RegisteredOwner", NULL, type_1, owner_Set, cbData_1);
       if(ret1 != ERROR_SUCCESS)
       {
             MessageBox("错误,无法查询有关注册表的信息");
             return;
       }
       CString strname;
       strname = CString(owner_Get);
       MessageBox(strname);
       delete[] owner_Get;
       ::RegCloseKey(hKEY);

3.增加注册表子项
       //键名
       CString str = "{64FF040-5081-101B}";
       LPBYTE addKey = new BYTE[str.GetLength() +1];
       CString_To_LPBYTE(str);

       HKEY hKey;
       long res = RegCreateKey(HKEY_CLASSES_ROOT, "*\\shellex\\添加的条目", &hKey);
       //生成注册键值
       res = RegSetValueEx(hKey, "", NULL, REG_SZ, addKey, str.GetLength() +1);
       delete[] addKey;
       RegCloseKey(hKey);

4.删除注册表
       long res;
       res = RegDeleteKey(HKEY_CLASSES_ROOT", "*\\shellex\\新增的条目");