VC 注册表操作

来源:互联网 发布:sql server 2005 sp3 编辑:程序博客网 时间:2024/05/21 22:41
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("系统参数错误,不能随系统启动");     } }
原创粉丝点击