2012-12-22 3 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 *'로 선언하십시오. 레지스트리의 데이터가 Null 종료되지 않을 가능성을 허용해야합니다. –

+0

'char * regValue = (LPBYTE) lpValue; '를 시도했지만, VS는 char *에 LPBYTE 유형의 값을 사용할 수 없다고보고하고 있습니다. – Ryan

+0

DWORD 또는 버퍼를 읽으십니까? – James

답변

2

lpValuechar*으로 선언해야합니다.

char* lpValue; 

그런 다음 new를 호출을 할당합니다.

레지스트리 데이터의 형식이 잘못되어 Null 종결자가없는 경우 추가 요소를 할당하십시오. 그것은 일어날 수있는 일입니다. delete[]를 사용

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

할당 해제를 :

lpValue[dwSize] = '\0'; 

그런 다음 값을 얻을 : 다음 \0에 마지막 요소를 설정

delete[] lpValue; 
+0

'RegQueryValueEx()'대신 ['RegGetValue()'] (http://msdn.microsoft.com/en-us/library/ms724868.aspx)를 사용하면 널 종료 자 문제를 처리합니다. –

+0

@Remy RegGetValue는 XP에서 실행되지 않으므로 보통 간과됩니다. –

+0

XP의 64 비트 버전에서 사용할 수 있습니다. –