库libusb提供对USB设备的跨平台访问。首先要获得附加USB设备的列表。下面的代码试图从libusb获取这样的列表,但是会崩溃。这个问题与libusb_get_device_list的定义和_libusb_device_list**类型有关,尽管其他事情也可能是错误的。
如何正确定义libusb_get_device_list?
C函数的文档如下:dev.html#gac0fe4b65914c5ed036e6cbec61cb0b97
#lang racket/base
;;; FFI for libusb version 1.0.
(require ffi/unsafe
ffi/unsafe/define)
;;; Types
(define _ssize_t _ssize) ; signed version of _size_t
;;; Load the shared library
(define libusb
(case (system-type)
[(macosx) (ffi-lib "/usr/local/lib/libusb-1.0.0.dylib")]
[else (error "Contact maintainer")]))
;;; Create define-usb which makes it easy to define functions from libusb
(define-ffi-definer define-usb libusb)
; ssize_t libusb_get_device_list(libusb_context *ctx, libusb_device ***list)
(define _libusb_context (_cpointer/null 'libusb-context))
(define _libusb_device_list** (_cpointer 'device_list**))
(define-usb libusb_get_device_list (_fun (ctx : _libusb_context)
(linked-list : (_ptr o _libusb_device_list**))
-> (number-of-devices : _ssize_t)
; output wrapper:
-> (list number-of-devices linked-list)))
; Returns a list of USB devices currently attached to the system.
; Unreference all devices, then free the list using libusb_free_device_list.
; A null context gives the default context.
; (libusb_get_device_list #f)发布于 2016-07-04 21:57:11
您的签名是正确的(尽管您的参数名并不完全正确--输出参数是一个NULL-terminated数组,而不是一个链接列表)。但是,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)...or调用它来生成一个上下文,您以后可以提供给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))https://stackoverflow.com/questions/38191814
复制相似问题