2012-07-04 4 views
1

레지스트리 항목에서 키를 읽는 응용 프로그램이 있습니다.LPCWST가 유니 코드 문자 집합에서 작동하지 않습니다.

그러나 Unicode character set에 그 키를 열 수 없습니다 Multi-Byte Character Set에 좋은 작업

이 내 코드입니다 :

HKEY hkey = 0; 
    char buf[255] = {0}; 
    DWORD dwType = 0; 
    DWORD dwBufSize = sizeof(buf); 
    const char* subkey_x64 = "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\UCP"; 
    const char* subkey_x86 = "SOWTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\UCP"; 

    if (RegOpenKey(HKEY_LOCAL_MACHINE, (LPCWSTR)subkey_x64, &hkey) == ERROR_SUCCESS) 
    { 
     dwType = REG_SZ; 
     if (RegQueryValueEx(hkey, (LPCWSTR)"DisplayIcon", 0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS) 
     { 
      cout << "Key Value IS: " << buf << endl; 
     } 
     else 
     { 
      cout << "Cannot get key value..." << endl << endl; 
     } 
    } 
    else 
    { 
     cout << "Cannot open key\n" << endl << endl; 
     RegCloseKey(HKEY_PERFORMANCE_DATA); 
    } 

누구 아이디어 왜 열 수 없습니다 키가 있습니까?

(LPCWSTR)은 좋은 방법이 아닙니까? 비주얼 스튜디오 2010

+1

또 다른 좋은 예를 보여주는 이유는 "* 너는하지 말라! *";-) – alk

답변

3

const char*를 사용

임은 유니 코드 문자열이 아닙니다. const wchar_t*으로 변경하면 캐스트가 필요하지 않습니다.

캐스트를 사용하면 해당 주소를 유니 코드 문자열에 대한 포인터로 해석하도록 컴파일러에 말하지 만 실제로는 그렇지 않습니다.

유니 코드 문자열 리터럴을 선언 할 때는 L 접두사를 사용해야합니다 (다시 캐스팅 할 필요 없음). L"DisplayIcon". 코드가 유니 코드와 멀티 바이트 모두에서 실행될 수 있다면 TEXT() 매크로를 사용하여 (또는 그 짧은 버전 _T()) _T("DisplayIcon")의 트릭을 수행 할 수 있습니다.

2

L으로 문자를 wchar_t*에 유형을 변경하고 접두어하여 문자열 리터럴 와이드 문자열 리터럴을 확인 : 레지스트리 함수 호출의 변수를 캐스팅

const wchar_t* subkey_x64 = 
    L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\UCP"; 
const wchar_t* subkey_x86 = 
    L"SOWTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\UCP"; 

없음 요구 사항 및 기타 문자열을 접두사로 기억 리터럴은 L입니다.

1

다른 유형의 포인터이기 때문에 const char *에서 LPCWSTR까지만 대소 문자를 구분할 수 없습니다.

LPCWSTR subkey_x64 = TEXT("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\UCP"); 
LPCWSTR subkey_x86 = TEXT("SOWTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\UCP"); 
1

현재 코드가 작동하지 않는 이유는 실제 질문에 대답하기 : 당신이 사용하는 대신 MultiByteToWideChar 기능을 사용하여 const char *LPCWSTR로 변환하거나 필요 하나 RegOpenKeyRegQueryValueExRegOpenKeyW로 정의되는 매크로입니다 및 Unicode 빌드에서는 RegQueryValueExW이고 비 유니 코드 빌드에서는 RegOpenKeyARegQueryValueExA입니다. 다른 기능입니다. W 버전에서는 넓은 문자열이 필요합니다.