0

私は今それを2時間グーグルで検索しました、そして私は私の問題に対する答えを見つけることができません:私はレジストリREG_SZ値を取得してそれをに渡す必要がありますchar*

char host_val[1024];
DWORD hostVal_size = 1024;
char* hostName;
DWORD dwType = REG_SZ;

RegOpenKeyEx(//no problem here);
if( RegQueryValueEx( hKey, TEXT("HostName"), 0, &dwType, (LPBYTE)&host_val, &hostVal_size ) == ERROR_SUCCESS )
{
      //hostName = host_val; 
} 

この変換はどのように行う必要がありhostName = host_valますか?

4

3 に答える 3

4

結果host_valnullで終了しない可能性のある文字列になる可能性があるため(「備考」を参照)、新しく割り当てられた文字列に。を付けてコピーし、memcpynullで終了することを確認する必要があります。

hostName = new char[hostVal_size + 1];
// host_val may or may not be null-terminated
memcpy(hostName, host_val, hostVal_size);
hostName[hostVal_size] = '\0';

後でする必要がありdelete[]ますhostName

于 2012-09-07T06:06:36.553 に答える
3

関数のANSIバージョンを使用する

RegQueryValueExA

そうすれば、変換する必要はありません。

于 2012-09-07T06:29:25.030 に答える
2

Unicodeでコンパイルしている場合は、Unicode文字列(おそらく終了していない)を狭いcharバッファにコピーしています。Unicode文字列の最初の文字は0x3100になります(マシンのエンディアンを考慮します。これはおそらくリトルエンディアンであり、IPアドレスが192であると言ったという事実...)

char []配列に詰め込まれたその値は、単一のchar-nullで終了する文字列として報告されます。2つのオプションがあります。

  1. RegQueryValueExAを使用します。他のすべては同じままです。または、
  2. char[]配列をwchar_t[]配列に変更し、現在実行していることを実行してから、WideCharToMultiByteを使用してnarrowに変換します(ドキュメントはSDKにあります)。

明らかな理由で、私はこれら2つのオプションの前者を採用します。

于 2012-09-07T07:25:42.490 に答える