通過下面的代碼,我一直試圖查詢某個注冊表鍵下的值資訊。我只是對值的數量、值的名稱長度和值的大小感興趣。但當我運行代碼時,它只給出了正確的值,即值的數量。其他的值都太長了,不正確。如果我延長值,它就會改變,但除了值的數量外,值永遠不會變短,除非我直接洗掉變數。
使用的代碼:
HKEY openRegister(HKEY rootKey, const wchar_t* subKey)
{
HKEY hKey。
LONG result=RegOpenKeyEx(rootKey,subKey,0,KEY_QUERY_VALUE | KEY_WOW64_64KEY,&hKey) 。
if(result!=ERROR_SUCCESS)
{
if(result==ERROR_FILE_NOT_FOUND)
{
cout<<"Key not found"<<endl;
}
else "錯誤打開鑰匙"<<endl;
}
}
return hKey;
}
bool infoKey(HKEY regKey,DWORD &numValues,DWORD &maxNameLen,DWORD &maxValueSize)
{
LONG result=RegQueryInfoKeyA?
(
regKey,
NULL,
NULL,
NULL,
NULL。
NULL。
NULL。
&numValues,
&maxNameLen,
&maxValueSize。
NULL。
NULL, NULL.
);
if(result!=ERROR_SUCCESS)
{
cout<<"錯誤查詢資訊"<<endl。
return false。
}
else return true;
}
呼叫openRegister,然后呼叫infoKey函式,得到這樣的輸出:
數值的數量。2
最大名稱長度。12 最大名稱長度: 12
最大的值大小。12 最大數值大小: 12
在注冊表編輯器中,這是實際內容:
(default) | REG_SZ | (value not set)
string1 | REG_SZ | Hello
string2b | REG_SZ | 測驗
為什么 "值的數量 "只正確? 我是不是錯過了什么非常明顯的東西?
預先感謝,Benji.
uj5u.com熱心網友回復:
lpcbMaxValueLen引數輸出最長資料的大小,用位元組表示。 在你的例子中,最長的資料是Hello,作為一個Unicode字串(注冊表內部存盤字串的格式)是6個字符,算上空結束符,所以是12位元組的大小(每個字符2位元組)。 所以maxValueSize被設定為12是準確的。
lpcbMaxValueNameLen引數輸出以Unicode字符表示的最長的名字的長度,不包括空結尾。 在你的例子中最長的名字是string2b,它的長度為8個字符。 所以你會認為maxNameLen應該被設定為8,而不是12。但顯然,名稱緩沖區有一個未記錄的最小尺寸。為什么,誰知道呢。
另外,你正在使用 Unicode 函式打開鑰匙,然后使用 ANSI 函式查詢其資訊。 你不應該像這樣混合使用 ANSI 和 Unicode API。 你應該使用RegQueryInfoKeyW()而不是RegQueryInfoKeyA(),以配合你對RegOpenKeyExW()的使用(RegOpenKeyEx()呼叫,因為你傳遞的是一個wchar_t字串)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/320282.html
標籤:
