在我看来,您缺少几个指针取消引用,因此破坏了内存地址。
如果我没记错的话, 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(我已在这台机器上的硬件中启用)。