|
#1
|
|||
|
|||
Функция на C
Добрый вечер. Пытаюсь перевести код, который написан на C. С dll вызываю функцию bladerf_get_device_list. Вот сам код:
Код:
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. Функция возвращает 1 (одно устройство подключено, но сама запись заполняется неверными данными) Код:
Bladerf_Backend = (BLADERF_BACKEND_ANY, BLADERF_BACKEND_LINUX, BLADERF_BACKEND_LIBUSB, BLADERF_BACKEND_CYPRESS, BLADERF_BACKEND_DUMMY = 100); PDevice = ^TDevice; TDevice = 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: PDevice): integer; cdecl; //Try to execute procedure TForm1.Button1Click(Sender: TObject); var myblade : TDevice; pointer : PDevice; 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; |
#2
|
|||
|
|||
1. плохая идея использовать ключевое слово в качестве имени переменной (pointer)
2. На сколько я вижу, функция принимает указатель на массив структур, а не просто указатель на структуру. 3. какое соглашение по вызову прячестся за CALL_CONV. Обычно в С используется PASCAL, но разрабы могли и другой тип использовать. 4. char[] и PAnsiString это разные типы. Попробуй Array[0..32] of Byte или of AnsiChar. |