0

NPAPI dll ファイルを作成していて、レジストリから情報を取得する必要がありますが、RegQueryValueEx を使用すると、奇妙な文字が表示されます。

たとえば、私のコンピューター モデルは「N310」ですが、「Nfb1fb1」または「N$(」と表示されます。

文字セットの問題だと確信していますが、私は C++ を初めて使用するので、助けが必要です。

Visual Studio 2010 を使用しており、プロジェクトで UNICODE 文字セットを使用しています。

これが私のコードです:

char lszValue[255];
std::string cadena;
HKEY hKey;
LONG returnStatus;
DWORD dwType=REG_SZ;
DWORD dwSize=255;

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\BIOS", NULL, KEY_READ, &hKey);
if (returnStatus == ERROR_SUCCESS) {
    returnStatus = RegQueryValueEx(hKey, L"SystemProductName", NULL, &dwType,(LPBYTE)&lszValue, &dwSize);
    lszValue[dwSize] = 0;
    cadena.assign(lszValue, dwSize);

    return cadena;
}

どうもありがとうございました。

4

1 に答える 1

3

プロジェクトでUNICODE文字セットを使用している場合、おそらくすべてのWINAPI関数はUnicode文字列にバインドされています。つまり、RegQueryValueEx実際には配列ではなく配列RegQueryValueExWを取ります。wchar_tchar

非Unicodeのシングルバイトプロジェクトを使用する場合、関数はでRegQueryValueExAあり、で動作しchar[]ます。

プロジェクトを(非)Unicodeセーフにするには、TCHARの代わりにマクロを使用しcharます。このコードを試してください:

DWORD const dwSize=255;
TCHAR lszValue[dwSize];
std::wstring cadena;

HKEY hKey;
LONG returnStatus;
DWORD dwType=REG_SZ;
returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\BIOS", NULL, KEY_READ, &hKey);
if (returnStatus == ERROR_SUCCESS)
{
    returnStatus = RegQueryValueEx(hKey, L"SystemProductName", NULL, &dwType, (LPBYTE)&lszValue, &dwSize);
    lszValue[dwSize] = 0;
    cadena.assign(lszValue, dwSize);

    return cadena;
}

タイプだけを変更しました。他のエラー/タイプミスがあるかもしれません。std::wstringはwchar_t用であることを覚えておいてください

于 2012-08-09T00:09:53.650 に答える