Windows API一日一練(64) RegSetValueEx和RegDeleteValue函數
上一次說到怎麼建立註冊表的鍵,但接著下來的問題就是怎麼樣儲存資料到註冊表裡。註冊表使用樹形的方式管理資料,所以它的擴充和訪問都是比較靈活的。不過註冊表是系統重要訊息庫,每當Windows系統載入時,都首先從硬碟裡讀取它出來,才知道每台電腦所有硬體設定資訊,然後再載入不同的驅動程式。因此,註冊表作為系統重要的檔案,不要往裡面寫超過2K的資料大小,這樣可以提高系統的速度。下面就來介紹一下怎麼樣儲存一個字串的索引值。它需要使用RegSetValueEx函數來設定索引值和使用RegDeleteValue函數來刪除原來的索引值。
函數RegSetValueEx和RegDeleteValue聲明如下:
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 }