这个函数IOHIDManagerRegisterDeviceMatchingCallback在cocoa环境下运行吗?

时间:2009-11-20 18:18:32

标签: c macos iokit

我正在努力用Mac实现HID控制:我无法发送预期的功能,如下所示:

IOHIDManagerRegisterDeviceMatchingCallback(gIOHIDManagerRef,Handle_DeviceMatchingCallback,NULL);

with:gIOHIDManagerRef - >专用于此例程的有效HID管理器        Handle_DeviceMatchingCallback - > HID时将回调的例程        设备连接到USB端口        NUUL - >这里没有使用,包含来自USB的数据 问题是Handle_DeviceMatchingCallback必须是指向例程的指针,但是如何发送指针? 另一方面,来自Apple源代码的所有示例均基于C,而不是基于Cocoa。 那么,这是否意味着我必须在C ???中重写我的程序?或者是否可以在Cocoa环境下使用C部分的程序? 很抱歉这么“愚蠢”的问题查询,但是,虽然我在电子编程领域有一些背景,但我对可可很新。 您的意见将非常感谢!

迈克尔

2 个答案:

答案 0 :(得分:2)

Objective-C主要是C的超集。为了组合C和Objective-C代码,您只需将C代码编译为Objective-C代码。在Xcode中执行此操作的最简单方法是确保相关文件的扩展名为.m

要将处理路由回Objective-C世界,您需要一个指向Obj-C对象的指针。许多基于回调的API允许您提供通用指针(void *),然后在回调时它们会传回给您。这个论点有几个常见名称:

  • contextctx
  • refcon(“参考常量”)
  • userData
  • userInfo

如果回调API不允许这样做,你需要一些更简单的方法来将回调分派给你的对象,例如全局指针或查找表。

您正在使用的API可以让您提供上下文指针。当它回调您的代码时,它会为您提供注册回调时使用的指针。下面是一个从类型为MyObjCClass的对象注册回调的示例(请参阅下面的-registerMatching方法),然后使用上下文指针将回调路由回到注册回调进行处理的对象(请参阅Handle_DeviceMatchingCallback函数对上下文指针的使用。)

/*! @file C-ObjC-Callbacks.m
 *  Demonstrates routing a C callback to an Obj-C object
 *  using the callback's context pointer.
 */
#import <Cocoa/Cocoa.h>
#import <IOKit/hid/IOHIDManager.h>

// Global HID manager reference.
IOHIDManagerRef gIOHIDManager;
// HID callback
void Handle_DeviceMatchingCallback(void *context,
                                   IOReturn result,
                                   void *sender,
                                   IOHIDDeviceRef device);

@interface MyObjCClass : NSObject {
}
- (void)registerMatching;
- (void)handleMatchingDevice:(IOHIDDeviceRef)device
                      sender:(void *)sender
                      result:(IOReturn)result;
@end

@implementation MyObjCClass
- (void)registerMatching {
  // Assume gIOHIDManager has already been created.
  // Set up a device matching callback, providing a pointer to |self| as the context.
  IOHIDManagerRegisterDeviceMatchingCallback(gIOHIDManager,
                                             Handle_DeviceMatchingCallback,
                                             (void *)self);
}

- (void)handleMatchingDevice:(IOHIDDeviceRef)device
                      sender:(void *)sender
                      result:(IOReturn)result {
  // Do something...
}
@end

void
Handle_DeviceMatchingCallback(void *context,
                              IOReturn result,
                              void *sender,
                              IOHIDDeviceRef device); {
  MyObjCClass *const myObject = (MyObjCClass *const)context;
  [myObject handleMatchingDevice:device sender:sender result:result];
}

答案 1 :(得分:1)

  

Handle_DeviceMatchingCallback必须是指向例程的指针,但是如何   我可以寄一个指针吗?

如果要传递函数functionName,可以将其作为传递 &functionName

  

另一方面,来自Apple源的所有示例均基于   C,不是可可。嗯,这是否意味着我必须在C中修改我的程序   ???或者是否可以在Cocoa下使用C语言的一小部分程序   环境?

您可以随意混合C和Objective-C。只要你传递一个函数, 而不是附加到对象的方法,它应该工作。