2013-07-25 110 views
0

我試圖從註冊表中獲取所有我的comports。 不幸的是,我總是收到ERROR_MORE_DATA錯誤... 我已經試圖讓我的緩衝區更大,但它根本無法幫助。 這裏是我的代碼:C++ RegEnumValue拋出ERROR_MORE_DATA

DWORD registry::regGetValue(char *key, int index) 
{ 
HKEY hKey; 
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",0,KEY_ALL_ACCESS,&hKey); 
    DWORD chars = sizeof(key); 
    LONG result = RegEnumValue(hKey, index, key, &chars, 0,0,0,0); 
RegCloseKey(hKey); 
return result; 
} 

的參數是:

char key[512]; 
int index = 0; 
+2

sizeof(key)是4,因爲它是一個指針。將緩衝區的實際大小傳遞給你的函數並使用它。 –

+0

非常感謝,完美的作品。 問題是我總是試圖用sizeof(), 獲得大小,即使我想要獲得一個靜態數字的大小。 解決方法是:DWORD chars = 512; – user2618639

回答

0

緩衝區可能足夠大,你只是躺在函數關於它的實際大小。

當您在指針上使用sizeof運算符時,它將返回指針的大小,而不是它指向的數組大小。並且因爲key作爲char*傳遞給函數,所以它僅僅是一個指向數組的指針,而不是數組本身。

你必須緩衝區的實際大小傳遞給你的功能與指針沿着參數:

DWORD regGetValue(char *key, size_t length, int index) 
{ 
    HKEY hKey; 
    RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",0,KEY_ALL_ACCESS,&hKey); 
    DWORD chars = length; 
    LONG result = RegEnumValue(hKey, index, key, &chars, 0,0,0,0); 
    RegCloseKey(hKey); 
    return result; 
} 
char key[512]; 
int index = 0; 
regGetValue(key, sizeof(key), index); 

sizeof操作符這裏預期的,因爲它在陣列上運行本身,而不僅僅是一個指針。然而,這種方法在C API中很常見,很麻煩。

您可以通過使用一個函數模板,可自動推斷你的緩衝區的大小,並將它傳遞給實際執行工作的內部輔助函數的調用點事情簡化了一下:

// Helper function, implemented as a private member of your class 
DWORD regGetValue(char *key, size_t length int index) 
{ 
    HKEY hKey; 
    RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",0,KEY_ALL_ACCESS,&hKey); 
    DWORD chars = length; 
    LONG result = RegEnumValue(hKey, index, key, &chars, 0,0,0,0); 
    RegCloseKey(hKey); 
    return result; 
} 

// The public function that you will actually call 
template <size_t N> 
DWORD regGetValue(char (&key)[N], int index) 
{ 
    return regGetValue(key, N, index); 
} 
char key[512]; 
int index = 0; 
regGetValue(key, index); // length determined and passed automatically 

這是有效的,因爲您將參考傳遞給數組,而不是指針。

除了這一切,我必須嚴肅地質疑爲什麼你要調用ANSI函數並且使用char*作爲你的字符串。所有現代Windows應用程序都應該是Unicode。這意味着調用W- Windows API函數的後綴版本,並使用wchar_t*作爲字符串類型。確保UNICODE_UNICODE符號都是爲您的項目定義的,如果您使用了錯誤的類型,則會出現編譯時錯誤。