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)は良いアプローチではありませんか?

VisualStudio2010を使用しています

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

これらは異なるタイプへのポインタであるため、単に大文字const char *と小文字を区別することはできません。関数を使用LPCWSTRするように変換するか、代わりに次を使用する必要があります。const char *LPCWSTRMultiByteToWideChar

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 に答える
1

実際の質問に答えるために、なぜ現在のコードが機能しないのか:RegOpenKeyとはUnicodeビルドおよび非UnicodeビルドでRegQueryValueEx定義されているマクロです。これらは異なる機能です。バージョンは幅の広い文字列を想定しています。RegOpenKeyWRegQueryValueExWRegOpenKeyARegQueryValueExAW

于 2012-07-04T07:32:14.620 に答える