1

我有读取注册表项中的键的应用程序。

它的工作很好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) 不是好办法吗?

我正在使用视觉工作室 2010

4

4 回答 4

3

const char*不是 Unicode 字符串。更改为const wchar_t*,您将不需要演员表。

使用强制转换,您说编译器将该地址解释为指向 Unicode 字符串的指针,但事实并非如此。

此外,当您声明 Unicode 字符串文字时,您应该使用L前缀:(L"DisplayIcon"同样不需要强制转换)。如果您的代码可以在 Unicode 和多字节上运行,您可以使用TEXT()宏来为您解决问题(或其短版本_T()_T("DisplayIcon"):.

于 2012-07-04T07:11:19.550 回答
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.

于 2012-07-04T07:11:52.157 回答
1

要回答实际问题,为什么当前代码不起作用:RegOpenKey并且是在 Unicode 版本和非Unicode 版本RegQueryValueEx中定义为RegOpenKeyW和的宏。这些是不同的功能。这些版本需要宽字符串。RegQueryValueExWRegOpenKeyARegQueryValueExAW

于 2012-07-04T07:32:14.620 回答
1

您不能只区分大小写const char *LPCWSTR因为这些是指向不同类型的指针。您需要将您转换const char *LPCWSTR使用该MultiByteToWideChar功能,或者改为使用:

LPCWSTR subkey_x64 = TEXT("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\UCP");
LPCWSTR subkey_x86 = TEXT("SOWTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\UCP");
于 2012-07-04T07:13:25.290 回答