2012-12-22 98 views
1

我從註冊表中查詢數據,它被輸出爲LPBYTE,這就是我卡住的地方。我需要將LPBYTE轉換爲可以操作的數據類型,例如String。LPBYTE轉換爲字符串

這是到目前爲止我的代碼

HKEY hk; 
string poolID; 
DWORD dwSize  = 0; 
DWORD dwDataType = 0; 
DWORD dwValue; 
LPBYTE lpValue = NULL; 
CA2W registryLocation("Software\\Example"); 
// Check registry if exists, otherwise create. 
LONG openReg = RegOpenKeyEx(HKEY_CURRENT_USER, registryLocation, 0, KEY_QUERY_VALUE, &hk); 
if (openReg==ERROR_SUCCESS) { } else { cout << "Error (Could not open/create Registry Location)\n"; } 
// Get buffer size 
LONG getRegBuf = RegQueryValueExA(hk, "", 0, &dwDataType, lpValue, &dwSize); 
if (getRegBuf==ERROR_SUCCESS) { cout << "Got reg key buf size\n"; } else { cout << "Error (registry key does not exist)/n"; intro(); } 
lpValue = (LPBYTE)malloc(dwSize); 
// Open reg value 
LONG getReg = RegQueryValueExA(hk, "", 0, &dwDataType, (LPBYTE)&dwValue, &dwSize); 
if (getReg==ERROR_SUCCESS) { cout << "Successful\n"; } else { cout << "Error\n"; } 
cout << dwValue; 

任何幫助或代碼示例將非常感激。

+1

分配一個字符數組,並把它放在那裏。所以聲明'lpValue'是'char *'。您需要考慮到註冊表中的數據不是空終止的可能性。 –

+0

我試過'char * regValue =(LPBYTE)lpValue;'但是VS報告LPBYTE類型的值不能與char *一起使用。 – Ryan

+0

你在讀DWORD或緩衝區嗎? – James

回答

2

您需要聲明lpValuechar*

char* lpValue; 

然後通過撥打new來分配它。

lpValue = new char[dwSize+1]; 

在殼體註冊表數據是惡意形成和缺少空終止分配一個額外的元素。這是可能發生的事情。使用delete[]

LONG getReg = RegQueryValueExA(..., (LPBYTE)&dwValue, ...); 

解除分配:那麼最後一個元素設置爲\0

lpValue[dwSize] = '\0'; 

然後得到的值

delete[] lpValue; 
+0

如果使用['RegGetValue()'](http://msdn.microsoft.com/en-us/library/ms724868.aspx)而不是'RegQueryValueEx()',它會爲您處理null終止符問題。 –

+0

@Remy RegGetValue無法在XP上運行,因此通常會被忽略 –

+0

它在64位版本的XP上可用。 –