1
char value[255];
DWORD BufferSize = 8192;

RegGetValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", L"ProductName", RRF_RT_ANY, NULL, &value, &BufferSize);

cout << value;

RegKeyValue()を実行した後、値は

    value   0x0034f50c "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ...  char[255]

何が起きてる?

注: RegKeyValue()は0を返します

4

2 に答える 2

3

ここには2つの問題があります。

  1. RegGetValueの戻り値が。であることを確認してくださいERROR_SUCCESS。そうでない場合、ルーチンは失敗しました。また、書き込まれたバイト数を指定するようにBufferSize、何が書き込まれたかを確認できます。RegGetValue

  2. として定義されたバッファを渡し、そのchar value[255];長さを。として指定し8192ます。これにより、バッファオーバーランが発生する可能性があります。

于 2013-01-20T22:56:04.640 に答える
2

の戻り値を確認していませんRegGetValue。ほとんどの場合、呼び出しは失敗し、バッファvalueには何も割り当てられませんでした。常に戻り値を確認してください。

私たちが見ることができるコードから、私はあなたがバッファサイズについて嘘をついていることに気づきます。あなたはそれが8192バイトだと言います。ただし、割り当てたのは255バイトだけです。また、APIのUnicodeバージョンを呼び出していますが、charバッファーを渡します。文字列データを期待している場合は、ワイド文字のバッファを提供する必要があります。このAPIのUnicodeバージョンは、文字列データをUTF-16でエンコードされたテキストとして返します。

すべてを並べ替えたら、次にその値に格納されているタイプを確認する必要があります。typeパラメーターにNULLを渡します。変数へのポインタを渡し、文字列が実際にそこに格納されているかどうかを確認します。また、読み取られたバイト数を読み取り、それに応じてバッファにnullターミネータを設定する必要があります。

于 2013-01-20T22:53:00.077 に答える