首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于libusb的FFI :链接列表

用于libusb的FFI :链接列表
EN

Stack Overflow用户
提问于 2016-07-04 20:27:36
回答 1查看 112关注 0票数 2

库libusb提供对USB设备的跨平台访问。首先要获得附加USB设备的列表。下面的代码试图从libusb获取这样的列表,但是会崩溃。这个问题与libusb_get_device_list的定义和_libusb_device_list**类型有关,尽管其他事情也可能是错误的。

如何正确定义libusb_get_device_list

C函数的文档如下:dev.html#gac0fe4b65914c5ed036e6cbec61cb0b97

代码语言:javascript
复制
#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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-04 21:57:11

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

您需要调用libusb_initNULL来初始化默认上下文:

代码语言:javascript
复制
(define-usb libusb_init/default (_fun (_pointer = #f) -> _int)
  #:c-id libusb_init)

(libusb_init/default)

...or调用它来生成一个上下文,您以后可以提供给libusb_get_device_list

代码语言:javascript
复制
(define-usb libusb_init (_fun    (ctx    : (_ptr o _libusb_context))
                              -> (status : _int)
                              -> (values ctx status)))

(define-values [ctx status] (libusb_init))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38191814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档