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