昨天因為工作需要寫了一個小工具去修正註冊表內的鍵值,所以自己留下一些筆記在部落格。
註冊表的存取方式由微軟文件上說明得知,需要做3種步驟:
1. 得到Handle
2. 存取你要的鍵值
3.關閉Handle
而步驟1中,最主要是透過RegCreateKey與RegOepnKey來得到Handle,而這兩種方式的不同點在於RegCreateKey會去搜尋子鍵是否存在,如果不存在時會建立一個新的子鍵,而另一個API則是找不到就找不到。
步驟2中,我們如果要去設定鍵值ㄧ般都會使用RegSetValueEx() 其中它裡面的參數有分成不同型態的鍵值,像是REG_DWORD、REG_SZ...etc,使用時需要步驟1 所得到的Handle。
步驟3中則是去關閉你開啟的Handle,因此這3個步驟必須合在一起做。
底下是我把這3個步驟整理成副程式,使用時直接呼叫就可以了:
1.SetRegValueBy_REG_DWORD();
2.SetRegValueBy_REG_SZ();
3. SetRegValueBy_REG_MULTI_SZ();
void SetRegValueBy_REG_DWORD(LPCSTR szKeyPath,LPCSTR szKeyName,DWORD *dwData)
{
HKEY hk;
if (RegCreateKey(HKEY_LOCAL_MACHINE,szKeyPath, &hk))
OutputDebugString("error!");
if (RegSetValueEx(hk,
szKeyName,
0,
REG_DWORD,
(LPBYTE) dwData,
sizeof(DWORD)))
OutputDebugString("error!");
RegCloseKey(hk);
}
void SetRegValueBy_REG_SZ(LPCSTR szKeyPath,LPCSTR szKeyName,LPCSTR keyValue)
{
HKEY hk;
if (RegCreateKey(HKEY_LOCAL_MACHINE,szKeyPath, &hk))
OutputDebugString("error!");
if (RegSetValueEx(hk,
szKeyName,
0,
REG_SZ,
(BYTE*)(LPCSTR) keyValue,
strlen(keyValue)))
OutputDebugString("error!");
RegCloseKey(hk);
}
void SetRegValueBy_REG_MULTI_SZ(LPCSTR szKeyPath,LPCSTR szKeyName,LPCSTR keyValue)
{
HKEY hk;
if (RegCreateKey(HKEY_LOCAL_MACHINE,szKeyPath, &hk))
OutputDebugString("error!");
if (RegSetValueEx(hk,
szKeyName,
0,
REG_MULTI_SZ,
(BYTE*)(LPCSTR) keyValue,
strlen(keyValue)))
OutputDebugString("error!");
RegCloseKey(hk);
}
由副程式內可以得知,我是存取主鍵"HKEY_LOCAL_MACHINE"內的子鍵,所以如果要存取不同的主鍵時,要修改副程式內的主鍵。
底下是呼叫時的範例:
BOOL MyPatch()
{
LPCSTR szKeyPath1="SOFTWARE\\Microsoft\\WindowsNT\\MyTest";
LPCSTR szKeyName1="Label";
DWORD dwData=11;
SetRegValueBy_REG_DWORD(szKeyPath1,szKeyName1,&dwData);
return 0;
}
我Win32 的程式不好,雖然上面的程式碼可以用,但是如果有發現錯誤的地方,還是請大家幫忙指正並且告訴我~~~感恩喔!