2014-05-09 2 views
0

다음 VC++ 코드가 있습니다. DWORD에서 런타임시 실패하지 않는 TCHAR의 크기를 계산하는 방법.DWORD에서 TCHAR 배열의 크기

HKEY hKey = 0; 

DWORD dwType = REG_SZ; 

TCHAR buf[255] = {0}; 

DWORD dwBufSize = sizeof(buf); 


if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) 
{ 
    auto ret = RegQueryValueEx(hKey, TEXT("\\Device\\Serial0"), 0, &dwType, (LPBYTE)buf, &dwBufSize); 
    ... 
} 

그런 다음 bufSize 무엇을 중시해야한다. 다음 코드는 여전히 맞습니까?

DWORD bufSize = sizeof(buf); 
+0

관련 항목 :'RegQueryValueEx'는' NULL '로 끝나는 문자열. 반드시 종료하십시오. – jww

+1

종종 이렇게하는 방법은 데이터의 크기를 쿼리하고 적절한 크기의 버퍼를 만드는 것입니다. [RegQueryValueEx 함수] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724911 (v = vs.85) .aspx) – crashmstr

답변

0

bufSize 값은 510 바이트입니다. U는 TCHAR이 WCHAR 즉 2 바이트의 typedef임을 이해해야합니다. sizeof 연산자를 사용할 때마다 크기가 바이트로 표시됩니다.

주 : UNICODE_STRING이 정의되면 TCHAR은 8 바이트로 간주되고 그렇지 않으면 16 바이트가 넓은 문자를 포함합니다.

여기서 문제는 RegQueryValueEx API를 두 번 호출하여 해결할 수 있습니다. 언급 된 API의 마지막 인수는 [_in_out]입니다.이 것은 null로 전달하고 크기를 먼저 검색하는 것을 의미합니다. 그런 다음 API에 대한 다음 호출에서 크기를 전달하고 lpdata를 검색하십시오. (lpData 매개 변수에 지정된 버퍼가 데이터를 보유 할만큼 크지 않으면 함수는 ERROR_MORE_DATA를 반환하고 lpcbData가 가리키는 변수에 필요한 버퍼 크기를 저장합니다.)