0

こんにちは、C コードを使用してレジストリ キーに格納されている値を読み取ろうとしています。次のコードを試しました。コンパイルエラーは発生していません。しかし、出力として文字列の最初の文字のみを取得します。ここに私のコードサンプルがあります

#include "stdafx.h"
#include <windows.h>
#include <malloc.h>
#include <stdio.h>



#define TOTALBYTES    8192
#define BYTEINCREMENT 4096
#define BUFFER 8192



int _tmain(int argc, _TCHAR* argv[])
{
char value[255];
DWORD BufferSize = BUFFER;
RegGetValue(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Test\\subkey"), TEXT("blockedurlslist"), RRF_RT_ANY, NULL, (PVOID)&value, &BufferSize);
printf("%s",value);
system("pause");
}

誰かがアイデアを持っているなら、私を助けてください

4

2 に答える 2

1

RegGetValueまず、呼び出しが成功したかどうかを確認していません。Win32 API 呼び出しの戻り値を常に確認してください。

しかし、何が起こっているのかは非常に明確です。関数が最初の文字のみを含む文字列を返す場合、最も可能性の高い原因は、関数が ANSI として解釈する UTF-16 データを返していることです。文字列には、2 番目のバイトが 0 の UTF-16 でエンコードされた英語の文字が含まれます。また、ANSI として解釈される場合、0 は文字列ターミネータとして扱われます。

バッファにワイド文字ペイロードが含まれていることを宣言する必要があります。を使用しているのでTCHAR、次のようにします。

TCHAR value[255];

そしてバッファサイズは

DWORD BufferSize = sizeof(value);

printf幅の広い文字列を出力できるようにするには、 を変更する必要があります。

私があなただったら、私は使用しませんTCHAR。コード全体で Unicode を使用することをお勧めします。これにより、理解がはるかに簡単になり、最近では Windows 98 をサポートする必要があるとは思えません。

于 2012-05-08T08:13:04.273 に答える
0

折り返しの電話は何ですか?を返さない場合はERROR_SUCCESS失敗です。BufferSize呼び出し後にの値を調べて、API が要求するデータの量を確認できます。

コメントで指摘されているように、次のように言う必要があります。

char value[BUFFER];
DWORD BufferSize = sizeof value;

今では、バッファ サイズについて API に嘘をついているため、バッファの上書きが発生します。

おそらく、データが 16 ビット文字で返され、8 ビット呼び出しで印刷されているため、散在する 0 バイトが文字列ターミネータとして解釈されます。

于 2012-05-08T07:59:54.193 に答える