2012-08-03 48 views
0

我想做一個函數,列出特定(Windows註冊表)鍵的所有子項。RegEnumKeyEx無法正常工作

發生什麼事是隻有第一項被正確輸出,所有其他項被截斷或重複 - 我認爲這是一個緩衝區問題。

我已經閱讀過功能文檔,但它對我沒有太大的幫助。

下面的代碼:

#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; 
} 
+2

將錯誤檢查添加到此代碼。 *全部* winapi功能。 – 2012-08-03 20:18:07

+1

如果對該類型使用錯誤的符號,匈牙利語不會對您有所幫助。 dwValue和dwSize。一個是字符串,另一個是DWORD ... – 2012-08-03 20:20:32

回答

2

通話前添加以下命令行至RegEnumKeyEx()

dwSize = sizeof(dwValue); 

dwSize既是輸入和輸出參數。在輸入時,它指出了緩衝區的大小。 From RegEnumKeyEx()

指向變量的指針,該變量指定由lpName參數指定的緩衝區的大小(以字符爲單位)。這個大小應該包括終止空字符。如果函數成功,則由lpcName指向的變量包含存儲在緩衝區中的字符數,不包括終止空字符。

注意,你應該總是檢測功能(就像你爲RegOpenKeyEx()做)的返回值。

+0

謝謝!問題解決了! – user1575008 2012-08-03 20:42:40

1

如果您檢查來自RegEnumKeyEx調用的返回碼,您會看到您獲得0xEA,這意味着數據比您提供的緩衝區更長。

發生這種情況是因爲dwSize是輸入/輸出參數。當你調用它時,函數假定緩衝區最後有dwSize字符可用。返回時,dwSize已更改爲實際數據的大小。這使得dwSize比實際的緩衝區大小小得多。在下次調用時,它可能認爲您沒有足夠的空間,而是返回錯誤代碼。

您需要在每次調用之前重置dwSize。

+0

謝謝!我遵循你和@hmjd的說法,一切都好! – user1575008 2012-08-03 20:44:19