2012-07-04 42 views
1

我有應用程序讀取註冊表項中的鍵。LPCWST不適用於Unicode字符集

及其對Multi-Byte Character Set

Unicode 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)不好辦法嗎?

即時通訊使用Visual Studio 2010

+1

另一個很好的例子顯示了爲什麼「*你不會投!*」;-) – alk

回答

3

const char*不是一個Unicode字符串。改爲const wchar_t*,你不需要演員。

通過轉換,可以讓編譯器將該地址解釋爲指向Unicode字符串的指針,但不是。

此外,當你聲明一個Unicode字符串文字時,你應該使用L前綴:L"DisplayIcon"(同樣不需要轉換)。如果您的代碼可能同時在Unicode和多字節上運行,則可以使用TEXT()宏爲您(或其簡短版本_T())操作:_T("DisplayIcon")

2

通過改變類型wchar_t*和前綴文字與L使字符串字面量寬字符串文字:

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,因爲這些是指向不同類型的指針。您可能需要使用MultiByteToWideChar函數來轉換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

要回答的實際問題,爲什麼目前的代碼無法正常工作:RegOpenKeyRegQueryValueEx是被定義爲RegOpenKeyW宏和Unicode構建中的RegQueryValueExW以及非Unicode構建中的RegOpenKeyARegQueryValueExA。 這些是不同的功能。 W版本期望寬字符串。

相關問題