来自 C DLL 的 Delphi 中的缓冲区和指针

Buffer and pointers in Delphi from C DLL

我仍在从 DLL 过程中学习,由于不存在 Delphi FTDI Libmpsse 库,我必须从头开始使用 DLL。

然而,我在 Delphi 方面远非完美! 我已经使用它几年了,没有接触过指针。

这是我现在坚持的特定行(这是我试图翻译的内容):

function I2C_DeviceWrite(
  handle              :dword;
  deviceAddress       :uint32;
  sizeToTransfer      :uint32;
  out buffer          :byte;
  out sizeTransferred :uint32;
  options             :uint32
):FT_Result; cdecl; external 'libmpsse.dll';

从 API 用户指南中是这样描述 C 方式的:

FT_STATUS I2C_DeviceWrite(
  FT_HANDLE handle, 
  uint32    deviceAddress,
  uint32    sizeToTransfer, 
  uint8    *buffer, 
  uint32   *sizeTransferred,
  uint32    options )

据我理解,Asterix 在 C 中的意思是指针。

我还不知道如何正确声明它们。

有什么提示吗?

注意:我仍在阅读(XE2 基础)并尽我所能搜索指针和缓冲区!

谢谢!

顺便说一句,API指导来咨询:PDF from FTDI

编辑:

var
Buffer: array of Byte;
written,towrite:cardinal;
begin
SetLength(Buffer,I2C_DEVICE_BUFFER_SIZE);
buffer[0] := ;
towrite := 1;
i2c_openchannel(1,FT_HANDLE); //open channel 1
i2c_initchannel(FT_HANDLE,I2C_CLOCK_STANDARD_MODE and LATENCY_TIMER and 0);
i2c_devicewrite(FT_HANDLE,I2C_DEVICE_ADDRESS,towrite,buffer,written,I2C_TRANSFER_OPTIONS_START_BIT);
i2c_closechannel(FT_HANDLE); //close device

到目前为止一切都很好,除了 i2c_devicewrite 行!
它让我 E2033:unable 编译实际和正式的 var 参数必须相同

您错误地翻译了字节数组参数。您使用了

out buffer: byte

这是一个单字节,通过引用传递出去。应该是

buffer: PByte

这里表示指向字节数组的指针。

然后传递数组第一个元素的地址。像这样:

@Buffer[0]

或者像这样

PByte(Buffer)

请注意,除了字节数组参数外,我没有检查任何其他内容。

FWIW,这里的常量数组可能比动态数组更简单。

我还要评论说您似乎忽略了 return 值。永远不要那样做。始终检查 return 值是否有错误。