ポインタの逆参照がいくつか欠落しているため、メモリアドレスが破損しているように見えます。
私が間違っていない場合、Move()呼び出しは次のようになります。
Move(Buffer^, ReceiveBuffer^, iSize);
I've removed my totally worthless post content (leaving it for posterity and to give someone a good laugh).
I don't see anything that would be affected by Unicode at all. I'm going to edit the tags to include Delphi (without the 2009), as some of the CodeGear Delphi developers are currently posting there. Perhaps one of them can see what's happening.
I made up a contrived example (actually a pretty useless one):
uses
IdGlobal;
type
TModBusFunction = Byte;
TModBusDataBuffer = array[0..256] of Byte;
TCommsBuffer=packed record
TransactionID: Word;
ProtocolID: Word;
RecLength: Word;
UnitID: Byte;
FunctionCode: TModBusFunction;
MBPData: TModBusDataBuffer;
Spare: Byte;
end;
procedure TForm1.FormShow(Sender: TObject);
var
Buffer: TIdBytes;
ReceiveBuffer: TCommsBuffer;
//iSize: Word;
begin
FillChar(ReceiveBuffer, SizeOf(ReceiveBuffer), 0);
ReceiveBuffer.TransactionID := 1;
ReceiveBuffer.ProtocolID := 2;
ReceiveBuffer.RecLength := 3;
ReceiveBuffer.UnitID := 4;
ReceiveBuffer.FunctionCode := 5;
FillChar(ReceiveBuffer.MBPData[0], SizeOf(ReceiveBuffer.MBPData), 6);
ReceiveBuffer.Spare := 7;
SetLength(Buffer, SizeOf(ReceiveBuffer));
Move(ReceiveBuffer, Buffer, SizeOf(ReceiveBuffer));
Move(Buffer, ReceiveBuffer, SizeOf(ReceiveBuffer));
ReceiveBuffer.UnitID := 8;
end;
次に、終了前の最後の行にブレークポイントを設定して実行しました。ブレークポイントに到達したとき、ToolTip Evaluationを使用してReceiveBufferの内容を確認したところ、すべてが完全に正常に見えました。ReceiveBuffer.Spareが7であることを含め、すべての適切な値を確認できました。次に、シングルステップで、ReceiveBuffer.UnitIDを確認しました。実際には8の値でした。
ただし、F9キーを押して実行を続行すると(フォームを閉じてアプリケーションを終了できることを期待して)、CPUウィンドウが表示され、Vistaからアプリケーションが応答しないというメッセージが表示されました。私はntdll.DebugBreakPoint、IIRCのすぐ外にいて、シングルステップでntdll.RtlReportExceptionが発生しました。何が起こっているのかよくわかりませんが、良くありません。まだ探しています。
Edit2:もう一度実行したところ、同じ結果になりました。ただし、今回はCtrl + F2を使用してアプリを終了する前に、Vistaが「Project1.exeが閉じられました」ことを示し、DEP(このマシンのハードウェアで有効にした)について言及するポップアップツールトレイウィンドウを表示していることに気付きました。