Win 95和NT的註冊表是系統中非常重要的壹部分。Win32 API中有壹組Reg函數來處理這些問題。壹般的讀寫過程如下:
1.使用RegOpenKeyEx或RegCreateKeyEx函數打開或創建壹個密鑰;
2.如果上壹步成功,使用RegQueryValueEx讀取子項的值,使用RegSetValueEx設置子項,使用RegEnumKey獲取所有子項,使用RegDeleteKey刪除壹個項;
3.使用RegCloseKey在操作後關閉。
以下程序打開HKEY _當前_用戶\軟件\ zealsoft studio \ ask pro FTP \ last time項,然後讀取WOL子項的值。
HKEY HKEY;
char SZ[256];
DWORD dwtype,sl = 256
RegOpenKeyEx(HKEY _當前_用戶
"軟件\ \ Zeal soft studio \ \ ask pro FTP \ \ last time ",
NULL、KEY _ ALL _ ACCESS & amp;HKEY);
RegQueryValueEx(hkey,“WOL”,NULL & amp;dwtype,(LP byte)SZ & amp;sl);
RegCloseKey(HKEY);
MFC程序可以使用CRegKey類來讀寫註冊表。VB中調用API的方法,請參考QA000226《如何訪問Windows系統註冊表》。
打開註冊密鑰
LONG RegOpenKeyEx( HKEY hKey,//打開密鑰的句柄
LPCTSTR lpSubKey,//要打開的子項名稱的地址
DWORD ulOptions,// reserved =0
REGSAM samDesired,//安全訪問掩碼
PHKEY phkResult //打開密鑰的句柄的地址
);
示例:
HKEY高清;
hd = HKEY _ LOCAL _ MACHINE
char * regkey name = " SoftWare \ \ xy 123 \ \ Poker \ \ ";
LONG a=RegOpenKeyEx(hd,Regkeyname,0,KEY_READ,& amp高清);//ERROR_SUCCESS成功返回,否則返回錯誤代碼。
關閉註冊密鑰
LONG RegCloseKey( HKEY hKey //要關閉的鍵的句柄);
示例:
RegCloseKey(HKEY _ LOCAL _ MACHINE);
或者:RegCloseKey(高清);
創建註冊密鑰
LONG RegCreateKeyEx( HKEY hKey,//打開密鑰的句柄
LPCTSTR lpSubKey,//子項名稱的地址
雙字保留,//保留=0
LPTSTR lpClass,//類字符串的地址
DWORD dwOptions,//特殊選項標誌
REGSAM samDesired,//所需的安全訪問
LP security _ ATTRIBUTES lpSecurityAttributes,//密鑰安全結構的地址
PHKEY phkResult,//打開句柄的緩沖區地址
LPDWORD lpdwDisposition //處置值緩沖區的地址);
示例:
char * sclass =//指定的類名為空。
DWORD nbf = 0;//接受返回值,指示是創建新項還是打開現有項。(REG_OPENED_EXISTING_KEY總是在測試後返回。
LONG II=RegCreateKeyEx(hd,Regkeyname,0,sclass,REG_OPTION_NON_VOLATILE,
KEY_READ|KEY_WRITE,NULL & amp;高清& ampnbf);
//REG_OPTION_NON_VOLATILE表示該項被永久保留。安全結構指示NULL,並自動獲得默認值。
//ERROR_SUCCESS成功返回,否則返回錯誤代碼。
枚舉鍵值
LONG RegEnumValue( HKEY關鍵字,//要查詢的關鍵字的句柄
DWORD dwIndex,//要查詢的值的索引
LPTSTR lpValueName,//值字符串的緩沖區地址
LPDWORD lpcbValueName,//值緩沖區大小的地址
LPDWORD lpReserved,// reserved =NULL
LPDWORD lpType,//類型代碼的緩沖區地址
LPBYTE lpData,//值數據的緩沖區地址
LPDWORD lpcbData //數據緩沖區大小的地址);
示例:
DWORD dinx = 0;
char value name[70];//分配數字名稱緩沖區
strcpy(valuename," desk pattern ");//指定任意鍵名。
DWORD nsize = 69//數字名稱緩沖區大小
DWORD k = REG _ SZ//指示數據類型。
無符號字符變量[70];//分配數值緩沖區
DWORD ncbvari = 69//數字緩沖區大小
dinx = 0;//從0開始
while((II=RegEnumValue(hd,dinx,valuename,& ampnsize,NULL & amp;k、vari和ampncbvari))
!=錯誤_否_更多項目)
{
dinx++;//index +1,準備取下壹個值
nsize = 69//恢復原始大小
ncbvari = 69
}
成功後返回值為0,變量設置如下:
Valuename=數字名稱,以0結尾;如桌面顏色
Nsize=數字名稱的長度,9
K=REG_SZ DeskColor的類型是REG_SZ。
Vari=鍵值,32768 DeskColor= "32768 ",
Ncbvari=密鑰長度REG_SZ,包括結尾0,=6,
讀取鍵值
LONG RegQueryValueEx( HKEY hKey,//要查詢的鍵的句柄
LPTSTR lpValueName,//要查詢的值的名稱的地址
LPDWORD lpReserved,//保留
LPDWORD lpType,//值類型的緩沖區地址
LPBYTE lpData,//數據緩沖區的地址
LPDWORD lpcbData //數據緩沖區大小的地址);
示例:
RegQueryValueEx(hd,valuename,NULL,& ampk、vari和ampncbvari);
變量的定義和成功後各變量的設定值與RegEnumValueEx相同。
寫入鍵值
LONG RegSetValueEx( HKEY hKey,//要為其設置值的鍵的句柄
LPCTSTR lpValueName,//要設置的值的名稱
雙字保留,//保留
DWORD dwType,//值類型的標誌
常量字節*lpData,//值數據的地址
DWORD cbData //值數據的大小);
示例:
strcpy(valuename," Hello ");
無符號字符變量[10];
DWORD k = REG _ SZ
strcpy((char*)vari," 1234567 ")
RegSetValueEx(hd,valuename,0,k,vari,7);
成功後,在撲克下添加壹個鍵值Hello: REG_SZ: 1234567。
寫壹個整數變量:
int hi = 8;
RegSetValueEx(pj,valuename,0,REG_BINARY,(unsigned char *)& amp;hi,sizeof(int));
成功後,在Poker下添加壹個鍵值Hello2: REG_BINARY :08 00 00 00。
void AddEventSource()
{
HKEY香港;
DWORD dwData
烏查爾·什布夫[80];
//將您的源名稱作為子項添加到應用程序下
EventLog註冊表項中的項。
if(RegCreateKey(HKEY _ LOCAL _ MACHINE,
"系統\ \當前控制集\ \服務\
\ \ event log \ \ Application \ \ sample app ",& amp香港))
ErrorExit("無法創建註冊表項。");
//設置消息文件的名稱。
strcpy(szBuf," % SystemRoot % \ \ System \ \ sampl app . dll ");
//將名稱添加到EventMessageFile子項中。
if (RegSetValueEx(hk,//子項句柄
" EventMessageFile ", //值名稱
0,//必須為零
REG_EXPAND_SZ,//值類型
(LPBYTE) szBuf,//指向數值數據的指針
strlen(szBuf) + 1)) //值數據的長度
ErrorExit("無法設置事件消息文件。");
//在TypesSupported子項中設置支持的事件類型。
dwData =事件日誌錯誤類型|事件日誌警告類型|
事件日誌_信息_類型;
if (RegSetValueEx(hk,//子項句柄
" TypesSupported ", //值名稱
0,//必須為零
REG_DWORD,//值類型
(LP byte)& amp;dwData,//指向值數據的指針
sizeof(DWORD))//值數據的長度
ErrorExit("無法設置支持的類型。");
RegCloseKey(香港);
}
以下代碼將註冊表引導shell的鍵值重寫為c:\ dk 1 \ ATM \ harp \ exatmshell . exe:
HKEY HKEY;
長res
DWORD數據類型= REG _ SZ
無符號字符SZ value[_ MAX _ PATH];
strcpy((char*)szvalue," C:\ \ dk 1 \ \ ATM \ \ HARP \ \ exatmshell . exe ");
RES =::RegOpenKeyEx(HKEY _ LOCAL _ MACHINE,
"軟件\ \ Microsoft \ \ Windows NT \ \當前版本\\Winlogon\\ ",0,
密鑰寫入|密鑰讀取。HKEY);
if(res!=錯誤_成功)
{
AfxMessageBox(" AAA ");
返回;
}
res = ::RegSetValueEx(hkey," Shell ",0,datatype,szvalue,strlen(LPCSTR(SZ value)));
RegCloseKey(HKEY);
if(res==ERROR_SUCCESS)
* AfxMessageBox("您已成功將註冊表引導shell的鍵值設置為c:\ \ dk 1 \ \ ATM \ \ harp \ \ exact shell . exe ");
其他
* AfxMessageBox("設置失敗:目標位置不存在這樣的鍵!");