0

そのため、一連の調査の結果、WideCharToMultiByte を使用すると、コントロール オブジェクトから OPOS を介してカスタム SO にデータを送信するのに効果的であることがわかりました。さて、バグに遭遇しました。DirectIO 部分では、C# コントロール オブジェクトのマップは DirectIO(int command, ref int data, ref string object); です。

そして、長い間、DirectIO を介して単純なコマンドを送信するだけで済みました。たとえば、LED をオンにするには、データをミリ秒単位の長さに設定し、オブジェクトを色に設定します。タグやカードにデータを書き込む必要がある場合、テキストを特殊な XML スタイルの文字列からバイト配列に解析する必要がありました...さて、バイト配列が必要になり、ASCII エンコーディングを使用する必要が生じました。その配列を文字列形式に入れ、それを書き込みます..

サービス オブジェクトでこの文字列を変換すると、正しく変換されないという問題が発生します。SysStringLen は長さが 4 バイトであることを認識していますが、null で停止しているようです。例 コントロール オブジェクトはこれを行います

        int page = 16;
        byte[] data = new byte[] { 0x19, 0x00, 0x30, 0x00 };
        string pData = System.Text.ASCIIEncoding.ASCII.GetString(data);
        msr.DirectIO(902, ref page, ref pData);

SOはこれを見る

int len = (int)SysStringLen(*pString);
long dataData = *pData;
char* dataObject = new char[1+len];

WideCharToMultiByte(CP_ACP, 0, *pString, -1, dataObject, len, NULL, NULL);
ByteUtil::LogArray("dataObject", (BYTE*)dataObject, len);

の出力が得られます

dataObject(4)-19:00:00:00

基本的に、最初のヌル文字に到達するとすぐに、残りのデータは失われます。数値を文字列から文字列に変換すると、その時だけの ByteUtil 関数があるため、問題なく動作します...しかし、そうしなければならないのは適切ではないようです...なぜできないのですか私はそれをBYTE配列として持っていますか?

4

1 に答える 1

2

非常に簡単です。次の行を変更するだけです。

WideCharToMultiByte(CP_ACP, 0, *pString, -1, dataObject, len, NULL, NULL);

の中へ:

WideCharToMultiByte(CP_ACP, 0, *pString, len, dataObject, len, NULL, NULL);

4番目のパラメーターを-1に設定すると、WideCharToMultiByteは入力文字列をnullで終了する文字列として扱います。BSTRは互換性の理由からヌル文字で終了しますが、文字列の一部としてヌル文字を含めることができるため、ヌル文字で終了したものとして扱わないでください。

于 2013-02-10T20:27:25.097 に答える