来自 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 值是否有错误。
我仍在从 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 值是否有错误。