ライブラリlibusbは、USBデバイスへのクロスプラットフォームアクセスを提供します。 開始点は、接続されたUSBデバイスのリストを取得することです。 以下のコードはlibusbからそのようなリストを取得しようとしますが、クラッシュします。 問題にはlibusb_get_device_list
の定義とタイプ_libusb_device_list**
のものがありますが、他のものも間違っている可能性があります。libusbのFFI:リンクリスト
libusb_get_device_list
を正しく定義するにはどうすればよいですか?
C関数のドキュメントはこちらです:http://libusb.sourceforge.net/api-1.0/group__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)