将C# DLL外部函数声明转换为 Delphi

2exbekwf  于 2023-03-01  发布在  C#
关注(0)|答案(1)|浏览(179)

我必须把这个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;

但是,当我调用函数时,我得到了一个“访问冲突”。

af7jpaap

af7jpaap1#

您的翻译几乎是正确的,但它确实有一个错误-TxDataRxData参数应该都是PByte,而不是分别是TBytesPTBytes

function ExecuteCommand(ComHandle: UInt32; TxAddr, TxCmCode, TxPmCode: Byte; TxDataLen: UInt16; TxData: PByte, var RxReplyType, RxStCode0, RxStCode1, RxStCode2: Byte; var RxDataLen: UInt16; RxData: PByte): Integer; stdcall; external 'CRT_571.dll';

TBytes是Delphi样式的动态array of Byte,它与C#的byte[]数组类型不兼容。当C#封送处理byte[]数组时,如果没有MarshalAs来控制封送处理的行为,(如这里的情况),封送程序的默认行为是简单的pin the array并传递一个指向数组第一个元素的指针,因此在 Delphi 端使用PByte

相关问题