【问题标题】:Buffer and pointers in Delphi from C DLL来自 C DLL 的 Delphi 中的缓冲区和指针
【发布时间】:2023-03-30 12:55:02
【问题描述】:

我仍在从 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] := $07;
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:无法编译实际和正式的 var 参数必须相同

【问题讨论】:

  • OT:定义FT_HANDLE的类型;使用原始代码中的数据类型(UInt32 类型在 Delphi 中存在一段时间)。
  • 红衣主教不一样? FT_HANDLE 在我的代码中是这样定义的: Var --> FT_HANDLE : DWord = 0;//API 中它必须始终为 0
  • 如果原始代码要求uint32,则声明您的类型为uint32,您不必担心cardinal是否相同。如果类型已经在 Delphi 中声明,使用已经声明的类型。用户指南中的FT_HANDLE是如何确切定义的?
  • FT_Handle 被定义为一个 DWORD。谢谢你的提示!相应地编辑了我的问题。
  • 另一个无耻的提示:我的文章Pitfalls of converting 描述了大部分内容。另请阅读Addressing pointers

标签: function delphi pointers dll buffer


【解决方案1】:

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

out buffer: byte

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

buffer: PByte

这里的意思是指向字节数组的指针。

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

@Buffer[0]

或者像这样

PByte(Buffer)

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

FWIW,这里的恒定长度数组可能比动态数组更简单。

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

【讨论】:

  • *sizeTransferred ...它有一个星号附加从C表示指针...抱歉忘记更新主要问题。
  • 来自 PDF:(out)sizeTransferred:指向包含读取字节数的变量的指针
  • 您将其声明为输出参数,这意味着传递了变量的地址。请阅读您之前关于我回答的主题的问题。
  • @David:你没有写错,ELCouz 写错了。无论如何,如果人们不完全按照别人告诉他们的去做,然后抱怨它不起作用,这总是一个问题。 ISTM 拼错其他人的名字是同一问题的另一个症状。 ;-)
  • 这类问题对提问者以外的任何人都没有帮助。从概念上讲,这个问题已经被问了数百次,我(和其他人)已经一遍又一遍地回答。没关系。我真正希望的是您尝试学习如何解决问题。这是你现在真正的机会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2015-04-04
  • 2012-06-09
相关资源
最近更新 更多