我必须把这个C#外部函数DLL声明翻译成 Delphi :
[DllImport("CRT_571.dll")]
public static extern int ExecuteCommand(UInt32 ComHandle, byte TxAddr, byte TxCmCode, byte TxPmCode, UInt16 TxDataLen, byte[] TxData, ref byte RxReplyType, ref byte RxStCode0, ref byte RxStCode1, ref byte RxStCode2, ref UInt16 RxDataLen, byte[] RxData);
我试过了:
Type
PTBytes = ^TBytes;
function ExecuteCommand(ComHandle: UInt32; TxAddr, TxCmCode, TxPmCode: byte; TxDataLen: UInt16; TxData: TBytes; var RxReplyType, RxStCode0, RxStCode1, RxStCode2: Byte; var RxDataLen: UInt16; RxData: PTBytes): integer; stdcall; external 'CRT_571.dll' name 'ExecuteCommand' delayed;
但是,当我调用函数时,我得到了一个“访问冲突”。
1条答案
按热度按时间af7jpaap1#
您的翻译几乎是正确的,但它确实有一个错误-
TxData
和RxData
参数应该都是PByte
,而不是分别是TBytes
和PTBytes
。TBytes
是Delphi样式的动态array of Byte
,它与C#的byte[]
数组类型不兼容。当C#封送处理byte[]
数组时,如果没有MarshalAs
来控制封送处理的行为,(如这里的情况),封送程序的默认行为是简单的pin the array并传递一个指向数组第一个元素的指针,因此在 Delphi 端使用PByte
。