[英]RegEnumKeyEx doesn't work properly
我正在嘗試制作一個列出特定(Windows注冊表)鍵的所有子鍵的函數。
發生的情況是只有第一個項目正確輸出,所有其他項目都被截斷或重復-我認為這是一個緩沖區問題。
我已經閱讀了功能文檔,但並沒有太大幫助。
這是代碼:
#include<stdio.h>
#include<windows.h>
void print_list(HKEY hkey, char* path){
char dwValue[255];
DWORD dwSize = 0;
DWORD n; // subkeys
HKEY tmp;
int i;
if(RegOpenKeyEx(hkey, path, 0, KEY_READ, &tmp) == ERROR_SUCCESS){
DWORD dwSize = sizeof(dwValue);
RegQueryInfoKey(tmp,NULL,NULL,NULL,&n,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
for(i=0; i< n; i++){
RegEnumKeyEx(tmp,i,dwValue,&dwSize,NULL,NULL,NULL,NULL);
printf("%s\n", dwValue);
}
RegCloseKey(tmp);
}
}
int main(){
print_list(HKEY_LOCAL_MACHINE, "SOFTWARE");
return 0;
}
在對RegEnumKeyEx()
的調用之前, RegEnumKeyEx()
下行添加到:
dwSize = sizeof(dwValue);
因為dwSize
既是輸入參數,也是輸出參數。 輸入時,它說明緩沖區的大小。 從RegEnumKeyEx()
:
指向變量的指針,該變量以字符為單位指定lpName參數指定的緩沖區的大小。 此大小應包括終止的空字符。 如果函數成功執行,則lpcName指向的變量將包含緩沖區中存儲的字符數,不包括終止的空字符。
注意,您應該始終檢查函數的返回值 (就像對RegOpenKeyEx()
所做的那樣)。
如果檢查RegEnumKeyEx調用的返回碼,您會看到得到0xEA,這意味着數據比提供的緩沖區長。
這是因為dwSize是輸入/輸出參數。 當您調用它時,該函數假定緩沖區最后有可用的dwSize字符。 返回時,dwSize已更改為實際數據的大小。 這使dwSize遠遠小於實際的緩沖區大小。 在下一次調用時,它可能認為您沒有足夠的空間,而是返回錯誤代碼。
您需要在每次調用之前重置dwSize。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.