1

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

IOHIDManagerRegisterDeviceMatchingCallback(gIOHIDManagerRef, Handle_DeviceMatchingCallback, NULL);

带有:gIOHIDManagerRef -> 专用于该例程的有效 HID 管理器 Handle_DeviceMatchingCallback -> 当 HID 设备连接到 USB 端口 NUUL 时将回调的例程 -> 此处未使用,包含来自 USB 的数据问题是那 Handle_DeviceMatchingCallback 必须是一个指向例程的指针,但我怎样才能发送一个指针?另一方面,来自 Apple 来源的所有示例都基于 C,而不是基于可可。好吧,这是否意味着我必须用 C 重写我的程序???或者是否有可能在可可环境下用 C 语言编写程序的一部分?对不起,这么“愚蠢”的问题查询,但是,虽然我在电子编程领域有一些背景,但我是可可的新手。您的意见将不胜感激!

迈克尔

4

2 回答 2

2

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

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

  • context或者ctx
  • 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];
}
于 2009-11-21T23:47:07.103 回答
1

Handle_DeviceMatchingCallback 必须是指向例程的指针,但我如何发送指针?

如果你想传入一个函数functionName,你可以将它作为 &functionName.

另一方面,来自 Apple 来源的所有示例都基于 C,而不是基于可可。好吧,这是否意味着我必须用 C 重写我的程序???或者是否有可能在可可环境下用 C 语言编写程序的一部分?

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

于 2009-11-20T18:30:12.867 回答