2

我正在尝试在 Objective C 中编写一些与 USB 设备交互的代码,但我一直在为传入报告设置回调函数。就我而言,它是一个 IOKIT 函数,但我认为这个问题更普遍,因为我(显然)不知道如何在 Objective-C 中正确设置 C 回调函数。我有一个处理 io 函数的“USBController”类

USB控制器.m:

#include <CoreFoundation/CoreFoundation.h>
#include <Carbon/Carbon.h>
#include <IOKit/hid/IOHIDLib.h>
#import "USBController.h"

static void Handle_IOHIDDeviceIOHIDReportCallback(
                                              void *          inContext,          // context from IOHIDDeviceRegisterInputReportCallback
                                              IOReturn        inResult,           // completion result for the input report operation
                                              void *          inSender,           // IOHIDDeviceRef of the device this report is from
                                              IOHIDReportType inType,             // the report type
                                              uint32_t        inReportID,         // the report ID
                                              uint8_t *       inReport,           // pointer to the report data
                                              CFIndex         InReportLength)     // the actual size of the input report
{
    printf("hello"); //just to see if the function is called
}

@implementation USBController
- (void)ConnectToDevice {
    ...
    IOHIDDeviceRegisterInputReportCallback(tIOHIDDeviceRefs[0], report, reportSize,
          Handle_IOHIDDeviceIOHIDReportCallback,(void*)self);
    ...
}
...
@end

所有函数也在头文件中声明。

我想我做的和我在这里找到的差不多,但它不起作用。该项目编译得很好,一切正常,直到有输入和回调函数被调用。然后我收到“EXC_BAD_ACCESS”错误。函数的前三个参数是正确的。我不太确定上下文..我做错了什么?

4

2 回答 2

4

我完全不确定您的 EXEC_BAD_ACCESS 取决于您的回调。确实,如果您说它被调用(我想您会看到日志)并且由于它只记录一条消息,那么这应该没有问题。

EXEC_BAD_ACCESS 是由试图访问已释放的对象引起的。您可以通过两种方式获取更多信息:

  1. 以调试模式执行程序,因此当它崩溃时,您将能够看到堆栈内容;

  2. 激活 NSZombies 或使用性能工具 Zombies 运行程序;这将准确地告诉您在释放后访问了哪个对象。

于 2011-07-29T18:09:03.123 回答
0

我知道如何解决这个问题。调用时:

IOHIDDeviceRegisterInputReportCallback(tIOHIDDeviceRefs[0], report, reportSize,
          Handle_IOHIDDeviceIOHIDReportCallback,(void*)self);

您不包括用于创建/类型称为报告的值的代码。但是,方法名称“Handle_IOHIDDeviceIOHIDReportCallback”来自 Apple 文档,其中在创建报告值时出错。https://developer.apple.com/library/archive/technotes/tn2187/_index.html

CFIndex reportSize = 64; 
uint8_t report = malloc( reportSize );  // <---- WRONG 
IOHIDDeviceRegisterInputReportCallback( deviceRef, 
                                        report,  
                                        reportSize,
                                        Handle_IOHIDDeviceIOHIDReportCallback,   
                                        context ); 

而是这样做:

uint8_t *report = (uint8_t *)malloc(reportSize);
于 2019-01-23T23:42:41.890 回答