![]() |
|
|
|
|
#1
|
|||
|
|||
|
Добрый вечер. Пытаюсь перевести код, который написан на 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. |