Posted on 2009-11-02 15:43
亂78糟 閱讀(2076)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
C語言派系
用CRegKey類操作注冊(cè)表,輸入如下代碼:
CRegKey reg;
LONG lRet;
lRet = reg.Open(HKEY_LOCAL_MACHINE,
_T("Software\\12345"),
KEY_ALL_ACCESS);
if (ERROR_SUCCESS != lRet)
{
lRet = reg.Create(HKEY_LOCAL_MACHINE,
_T("Software\\12345"), REG_NONE,
KEY_SET_VALUE); //注意這個(gè)參數(shù)是錯(cuò)誤的
if ( ERROR_SUCCESS != lRet )
{
return;
}
}
運(yùn)行之后發(fā)現(xiàn)注冊(cè)表中該項(xiàng)已經(jīng)成功添加,但是無法訪問。點(diǎn)擊就會(huì)彈出錯(cuò)誤提示無法打開,系統(tǒng)無法訪問指定的文件。由此生成了無法刪除的垃圾注冊(cè)表信息。
現(xiàn)在來分析一下,注意看create的第四個(gè)參數(shù),我傳入了錯(cuò)誤的值KEY_SET_VALUE。應(yīng)該為下面3個(gè)值中的一個(gè):
- REG_OPTION_BACKUP_RESTORE
0x00000004L
- REG_OPTION_NON_VOLATILE
0x00000000L
- REG_OPTION_VOLATILE
0x00000001L
但是
#define KEY_SET_VALUE (0x0002)
如果傳入這個(gè)值,那么Create(其實(shí)RegCreateKeyEx)函數(shù)檢測(cè)不出來這個(gè)錯(cuò)誤的參數(shù),如果傳入KEY_ALL_ACCESS可以檢測(cè)出來,返回84錯(cuò)誤(錯(cuò)誤的參數(shù))。由此猜想RegCreateEx錯(cuò)誤檢測(cè)dwOption參數(shù)采用類似這種方法:
if (dwOption < REG_OPTION_NON_VOLATILE || dwOption > REG_OPTION_BACKUP_RESTORE)
return 84;//對(duì)應(yīng)的宏
由此看來,這是RegCreateKeyEx函數(shù)的問題,算缺陷吧。