我正在开发一个应用程序来检测用Visual Studio 2012在vc ++中插入和拔出USB的时间。我已经添加了libusb 1.0库,它现在是一个跨平台库。
当我尝试注册事件处理程序时,我遇到了使用回调函数进行编译的问题。
#include "detect_usb_libusb.h"
#include <QtWidgets/QApplication>
#include <time.h>
#include <stdio.h>
#include <libusb.h>
static int count = 0;
int hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev,
libusb_hotplug_event event, void *user_data) {
static libusb_device_handle *handle = NULL;
struct libusb_device_descriptor desc;
int rc;
(void)libusb_get_device_descriptor(dev, &desc);
if (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED == event) {
rc = libusb_open(dev, &handle);
if (LIBUSB_SUCCESS != rc) {
printf("Could not open USB device\n");
}
} else if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == event) {
if (handle) {
libusb_close(handle);
handle = NULL;
}
} else {
printf("Unhandled event %d\n", event);
}
count++;
return 0;
}
int main (void) {
libusb_hotplug_callback_handle handle;
int rc;
libusb_init(NULL);
rc = libusb_hotplug_register_callback( NULL, (libusb_hotplug_event) (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED |
LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT), LIBUSB_HOTPLUG_ENUMERATE,
0x2047, LIBUSB_HOTPLUG_MATCH_ANY,
LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL,
&handle);
if (LIBUSB_SUCCESS != rc) {
printf("Error creating a hotplug callback\n");
libusb_exit(NULL);
return EXIT_FAILURE;
}
while (count < 2) {
_sleep(10000);
}
libusb_hotplug_deregister_callback(NULL, handle);
libusb_exit(NULL);
return 0;
}
我从libusb API获得了此代码,此时我真的迷失了。例外情况说:
error C2664: 'libusb_hotplug_register_callback' : cannot convert parameter 7 from 'int (__cdecl *)(libusb_context *,libusb_device *,libusb_hotplug_event,void *)' to 'libusb_hotplug_callback_fn'
但我不知道如何将我的“int(__ cdecl *)”函数转换为“int(* libusb_hotplug_callback_fn)”
非常感谢
答案 0 :(得分:1)
这是方法:static int LIBUSB_CALL hotplug_callback(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *user_data)
来源:https://github.com/libusb/libusb/blob/master/examples/hotplugtest.c
答案 1 :(得分:0)
我在VS 2013上遇到同样的错误,在libusb_hotplug_register_callback()中只是更改
hotplug_callback
到
(libusb_hotplug_callback_fn) hotplug_callback
答案 2 :(得分:-1)
这很可能是由于
rc = libusb_hotplug_register_callback( NULL, (libusb_hotplug_event) (**LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED |LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT**), LIBUSB_HOTPLUG_ENUMERATE,0x2047, LIBUSB_HOTPLUG_MATCH_ANY, LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL,&handle);
尝试使用
rc = libusb_hotplug_register_callback( NULL, (libusb_hotplug_event) (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED), LIBUSB_HOTPLUG_ENUMERATE,0x2047, LIBUSB_HOTPLUG_MATCH_ANY, LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL,&handle);
这是因为由于or(|
)运算符,它在按位OR运算后转换为整数。