そのため、一連の調査の結果、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配列として持っていますか?