1

少し奇妙な問題があります。コンソール出力ではなく、プログラムの特定の時点でテキストを出力するためのラベルを含むフォームがあります。次のコードがあるとします。

result = SetupDiGetDeviceRegistryProperty(deviceInfoSet, ref tBuff, 
                                          (uint)SPDRP.DEVICEDESC,
                                          out RegType, ptrBuf, 
                                          buffersize, out RequiredSize); 

if (!result)
{
    errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
    statusLabel.Text += "\nSetupDiGetDeviceRegistryProperty failed because "
                        + errorMessage.ToString();
}
else
{
    statusLabel.Text += "\nPtr buffer length is: " + ptrBuf.Length.ToString();

    sw.WriteLine(tCode.GetString(ptrBuf) );

    sw.WriteLine("\n");
    // This is the only encoding that will give any legible output.
    // Others only show the first character "U"
    string tmp = tCode.GetString(ptrBuf) + "\n"; 

    statusLabel.Text += "\nDevice is: " + tmp + ".\n";                    
}

ラベルにハードウェア ID 出力が 1 つだけ表示されます。このコードはループの最後にあります。最初は、これにより、ループがいくらかハングしていると思いましたが、出力をファイルに送信することにしたとき、ほとんど必要なものと出力がループ外に得られました。ここで何が起こっているのか誰か教えてもらえますか? [] バイト ( ptrBuf )からハードウェア ID を表す文字列を取得するだけです。ここで何が起こっているのか説明してもらえますか? 私の作業環境は MSVstudio 2008 Express です。ウィンドウズ7で.

ありがとう

4

4 に答える 4

3

tCode残念ながら、あなたは何が何であるかを示していません。

API 呼び出しのドキュメントを見ると、REG_SZ を設定する必要があるようです。私はそれがユニコードだと思う、つまり

string property = Encoding.Unicode.GetString(ptrBuf, 0, RequiredSize);

変換する必要があります。

ただし、複数の値を期待している場合は、それが- で'\0'区切られた文字列であるかどうか疑問に思います.Win32コントロールでそれを出力しようとすると、実際に最初の'\0'.

これを試して:

string property = Encoding.Unicode.GetString(ptrBuf, 0, RequiredSize);
                                  .Replace('\0', ' ');

それは(私が正しく推測している場合)値をスペースで区切る必要があります。

于 2009-05-14T20:45:50.043 に答える
2

エンコーディングを指定する必要があります:

// C# to convert a byte array to a string.
byte [] dBytes = ...
string str;
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
str = enc.GetString(dBytes);
于 2009-05-14T20:40:48.620 に答える
0

バイトを文字列に暗黙的に変換することはできません。変換のためのエンコード方法 (おそらく Unicode または ASCII) を選択する必要があります。バイトには、文字 (またはその他のデータ) を表すことができる数値が格納されますが、本質的には何も意味しません。これは、整数を文字列に変換することと哲学的に同等です。値を直接変換するか、値から何らかの意味を導き出すことができます (つまり、ASCII テーブルを使用する: 13 = TAB)。

リストした関数によって返される値は、文字列値を表すバイト配列を返す可能性が最も高いですが、それを使用可能な文字列に変換するための関連するエンコード方法を見つけるのはあなた次第です。

それが役に立ったことを願っています!

エリック

于 2009-05-14T20:47:31.583 に答える