尝试从Mac上的HID管理器获取HID设备引用时,指针错误不兼容

时间:2014-02-21 20:16:53

标签: objective-c c macos hid

我正在尝试编写用户空间设备驱动程序以从自定义HID设备中提取一些数据。我执行以下操作将HID中设备的引用存储到变量中。

CFSetRef device = IOHIDManagerCopyDevices(HIDManager);

在此之后我执行以下操作来注册我的回调,即设置从设备读取的报告(我正在努力的另一个区域。)

IOHIDDeviceRegisterInputReportCallback(device, report, ReadDailyDataResonposeSize, Handle_IOHIDDeviceIOHIDReportCallback, NULL);

我在“设备”引用上面的函数中遇到错误,说“通过CFSetRef传递不兼容的指针类型”

如果我尝试在创建设备时更改设备的类型,但我得到另一个说它需要是CFSetRef。所以我有点困惑,任何人都有任何建议。我是C的新手,也是Mac上的新手。到目前为止,文档对我来说非常简洁。

编辑:这是我的其余代码的链接以供参考。 http://pastebin.com/rFsHisdh

3 个答案:

答案 0 :(得分:1)

IOHIDManagerCopyDevices()会返回IOHIDDeviceRef元素的。 你必须从集合中获取一个元素并将其传递给 IOHIDDeviceRegisterInputReportCallback()

答案 1 :(得分:1)

根据documentation

,这是IOHIDDeviceRegisterInputReportCallback函数的签名
CF_EXPORT void IOHIDDeviceRegisterInputReportCallback(
    IOHIDDeviceRef device,
    uint8_t *report,
    CFIndex reportLength,
    IOHIDReportCallback callback,
    void *context) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER;

正如您所看到的,第一个参数应该是IOHIDDeviceRef,而您传递CFSetRef provide[s] support for the mathematical concept of a set Martin R 答案表明。

要获取集合的元素并传递设备(如果有),您应该执行以下操作:

CFSetRef devices = IOHIDManagerCopyDevices(HIDManager);
CFIndex size = CFSetGetCount(devices);
if(size > 0) {
    CFTypeRef array[size]; // array of IOHIDDeviceRef
    CFSetGetValues(devices, array);
    IOHIDDeviceRegisterInputReportCallback((IOHIDDeviceRef)array[0], report, ReadDailyDataResonposeSize, Handle_IOHIDDeviceIOHIDReportCallback, NULL);
}

希望它有所帮助。

答案 2 :(得分:0)

我遇到了这个问题。您是从不再正确的Apple文档(https://developer.apple.com/library/archive/technotes/tn2187/_index.html)中粘贴的。您的报告变量分配格式错误,从而在运行时导致内存错误。请执行以下操作:

uint8_t * report =(uint8_t *)malloc(reportSize); IOHIDDeviceRegisterInputReportCallback(device,report,ReadDailyDataResonposeSize,Handle_IOHIDDeviceIOHIDReportCallback,NULL);