首页 > 解决方案 > 将代码从 C 转换为 Delphi(使用 DLL)

问题描述

我需要你的帮助 ;)。尝试使用 SDR 接收器(刀片 RF)。我有 dll (bladeRF.dll)。我有一些关于 C 的代码(结构、枚举和函数)。C上的代码:

  typedef enum {
    BLADERF_BACKEND_ANY, 
    BLADERF_BACKEND_LINUX, 
    BLADERF_BACKEND_LIBUSB, 
    BLADERF_BACKEND_CYPRESS, 
    BLADERF_BACKEND_DUMMY = 100, 
   } bladerf_backend;

#define BLADERF_DESCRIPTION_LENGTH 33
#define BLADERF_SERIAL_LENGTH 33

struct bladerf_devinfo {
  bladerf_backend backend; 
  char serial[BLADERF_SERIAL_LENGTH]; 
  uint8_t usb_bus; 
  uint8_t usb_addr; 
  unsigned int instance; 
  char manufacturer[BLADERF_DESCRIPTION_LENGTH];
  char product[BLADERF_DESCRIPTION_LENGTH]; 
};

int CALL_CONV bladerf_get_device_list(struct bladerf_devinfo **devices);

我需要在 Delphi (Embarcadero 10.3) 上转换此代码。你能帮助我吗?我在德尔福上的代码:

Bladerf_Backend = (BLADERF_BACKEND_ANY,  BLADERF_BACKEND_LINUX,  BLADERF_BACKEND_LIBUSB,  BLADERF_BACKEND_CYPRESS,  BLADERF_BACKEND_DUMMY = 100);

PDevices = ^TDevices;
TDevices = record
  backend  : Bladerf_Backend;
  serial   : PAnsiChar;
  usb_bus  : Byte;
  usb_addr : Byte;
  instance : Integer;
  manufacturer :PAnsiChar;
  product :PAnsiChar;
end;

bladerf_get_device_list: function(point: PDevices): integer; cdecl;

//Try to execute
procedure TForm1.Button1Click(Sender: TObject);
var
  myblade : TDevices;
  pointer : PDevices;
begin
  pointer := @myblade;
  dongle_count:= bladerf_get_device_list(pointer);
  myblade := pointer^;
  Memo1.Lines.Add(myblade.serial);
  Memo1.Lines.Add(myblade.manufacturer);
  Memo1.Lines.Add(myblade.product);
end;

函数返回值 (1)。但是记录有错误值。需要你的帮助。谢谢。

标签: cdelphidll

解决方案


我不会在这里给出完整的答案,但一些元素可以帮助你。代码有几个问题。

该记录应该被称为TDevice(而不是TDevices),因为它代表一个设备。它应该为具有正确大小的字符串( serial, manufacturer, )嵌入缓冲区;product将指针改为 ( PAnsiChar) 将不起作用。

bladerf_get_device_list()接受一个指向 a 的指针TDevice。那不是你给它的。

bladerf_get_device_list()分配一个数组TDevice并返回其大小。您应该检查返回的值。使用完数组后,您应该使用bladerf_free_device_list()它来释放它。


推荐阅读