Windows API一日一练(64) RegSetValueEx和RegDeleteValue函数

来源:互联网 发布:go vs java 编辑:程序博客网 时间:2024/05/14 10:02
上一次说到怎么创建注册表的键,但接着下来的问题就是怎么样保存数据到注册表里。注册表使用树形的方式管理数据,所以它的扩展和访问都是比较灵活的。不过注册表是系统重要信息库,每当Windows系统加载时,都首先从硬盘里读取它出来,才知道每台电脑所有硬件配置信息,然后再加载不同的驱动程序。因此,注册表作为系统重要的文件,不要往里面写超过2K的数据大小,这样可以提高系统的速度。下面就来介绍一下怎么样保存一个字符串的键值。它需要使用RegSetValueEx函数来设置键值和使用RegDeleteValue函数来删除原来的键值。
 
函数RegSetValueExRegDeleteValue声明如下:
 
WINADVAPI
LONG
APIENTRY
RegSetValueExA (
    __in HKEY hKey,
    __in_opt LPCSTR lpValueName,
    __reserved DWORD Reserved,
    __in DWORD dwType,
    __in_bcount_opt(cbData) CONST BYTE* lpData,
    __in DWORD cbData
    );
WINADVAPI
LONG
APIENTRY
RegSetValueExW (
    __in HKEY hKey,
    __in_opt LPCWSTR lpValueName,
    __reserved DWORD Reserved,
    __in DWORD dwType,
    __in_bcount_opt(cbData) CONST BYTE* lpData,
    __in DWORD cbData
    );
#ifdef UNICODE
#define RegSetValueEx RegSetValueExW
#else
#define RegSetValueEx RegSetValueExA
#endif // !UNICODE
 
WINADVAPI
LONG
APIENTRY
RegDeleteValueA (
    __in HKEY hKey,
    __in_opt LPCSTR lpValueName
    );
WINADVAPI
LONG
APIENTRY
RegDeleteValueW (
    __in HKEY hKey,
    __in_opt LPCWSTR lpValueName
    );
#ifdef UNICODE
#define RegDeleteValue RegDeleteValueW
#else
#define RegDeleteValue RegDeleteValueA
#endif // !UNICODE
 
hKey是主键。
lpValueName是键名称。
dwType是键值类型。
lpData是键的数据。
cbData是键值的大小。
 
调用函数的例子如下:
#001  //打注册表。HKEY_CURRENT_USER/"Software"/"Wincpp"/"testreg"
#002  // /"Windows"//"winsize" = "800*600"
#003  //蔡军生 2007/11/04 QQ:9073204 深圳
#004  BOOL WriteProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry,
#005         LPCTSTR lpszValue)
#006  {
#007         //
#008         LONG lResult;
#009         if (lpszEntry == NULL) //删除整键。
#010         {
#011               HKEY hAppKey = GetAppRegistryKey();
#012               if (hAppKey == NULL)
#013               {
#014                    return FALSE;
#015               }   
#016 
#017               lResult = ::RegDeleteKey(hAppKey, lpszSection);
#018               RegCloseKey(hAppKey);
#019         }
#020         else if (lpszValue == NULL)
#021         {
#022               //删除键值。
#023               HKEY hAppKey = GetAppRegistryKey();
#024               if (hAppKey == NULL)
#025               {
#026                    return FALSE;
#027               }   
#028 
#029               HKEY hSecKey = NULL;
#030               DWORD dw;
#031               RegCreateKeyEx(hAppKey, lpszSection, 0, REG_NONE,
#032                    REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
#033                    &hSecKey, &dw);
#034               RegCloseKey(hAppKey);
#035 
#036               if (hSecKey == NULL)
#037               {
#038                    return FALSE;
#039               }   
#040 
#041               //
#042              lResult = ::RegDeleteValue(hSecKey, (LPTSTR)lpszEntry);
#043               RegCloseKey(hSecKey);
#044         }
#045         else
#046         {
#047               //设置键值。
#048               HKEY hAppKey = GetAppRegistryKey();
#049               if (hAppKey == NULL)
#050               {
#051                    return FALSE;
#052               }   
#053 
#054               HKEY hSecKey = NULL;
#055               DWORD dw;
#056               //创建子键。
#057               RegCreateKeyEx(hAppKey, lpszSection, 0, REG_NONE,
#058                    REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
#059                    &hSecKey, &dw);
#060               RegCloseKey(hAppKey);
#061 
#062               if (hSecKey == NULL)
#063               {
#064                    return FALSE;
#065               }   
#066 
#067               //设置子键中的项值。
#068              lResult = RegSetValueEx(hSecKey, lpszEntry, NULL, REG_SZ,
#069                   (LPBYTE)lpszValue, (lstrlen(lpszValue)+1)*sizeof(TCHAR));
#070               RegCloseKey(hSecKey);
#071         }
#072         return lResult == ERROR_SUCCESS;
#073 
#074  }