用于libusb的FFI:链表

时间:2016-07-04 20:27:37

标签: racket

库libusb提供对USB设备的跨平台访问。 起点是获取连接的USB设备列表。 下面的代码试图从libusb获取这样的列表,但崩溃了。 这个问题与is_required的定义有关。 和类型libusb_get_device_list虽然其他事情也可能是错误的。

如何正确定义_libusb_device_list**

C函数的文档在这里:http://libusb.sourceforge.net/api-1.0/group__dev.html#gac0fe4b65914c5ed036e6cbec61cb0b97

libusb_get_device_list

1 个答案:

答案 0 :(得分:3)

您的签名是正确的(尽管您的参数名称不太正确 - 输出参数是NULL - 终止的数组,而不是链接列表)。但是,即使您不使用上下文,libusb也要求您调用libusb_init。使用libusb_init调用NULL将初始化默认上下文。

您需要使用libusb_init调用NULL来初始化默认上下文:

(define-usb libusb_init/default (_fun (_pointer = #f) -> _int)
  #:c-id libusb_init)

(libusb_init/default)

...或者调用它来生成以后可以提供给libusb_get_device_list的上下文:

(define-usb libusb_init (_fun    (ctx    : (_ptr o _libusb_context))
                              -> (status : _int)
                              -> (values ctx status)))

(define-values [ctx status] (libusb_init))