我正在努力用Mac实现HID控制:我无法发送预期的功能,如下所示:
IOHIDManagerRegisterDeviceMatchingCallback(gIOHIDManagerRef,Handle_DeviceMatchingCallback,NULL);
with:gIOHIDManagerRef - >专用于此例程的有效HID管理器 Handle_DeviceMatchingCallback - > HID时将回调的例程 设备连接到USB端口 NUUL - >这里没有使用,包含来自USB的数据 问题是Handle_DeviceMatchingCallback必须是指向例程的指针,但是如何发送指针? 另一方面,来自Apple源代码的所有示例均基于C,而不是基于Cocoa。 那么,这是否意味着我必须在C ???中重写我的程序?或者是否可以在Cocoa环境下使用C部分的程序? 很抱歉这么“愚蠢”的问题查询,但是,虽然我在电子编程领域有一些背景,但我对可可很新。 您的意见将非常感谢!
迈克尔
答案 0 :(得分:2)
Objective-C主要是C的超集。为了组合C和Objective-C代码,您只需将C代码编译为Objective-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];
}
答案 1 :(得分:1)
Handle_DeviceMatchingCallback必须是指向例程的指针,但是如何 我可以寄一个指针吗?
如果要传递函数functionName
,可以将其作为传递
&functionName
。
另一方面,来自Apple源的所有示例均基于 C,不是可可。嗯,这是否意味着我必须在C中修改我的程序 ???或者是否可以在Cocoa下使用C语言的一小部分程序 环境?
您可以随意混合C和Objective-C。只要你传递一个函数, 而不是附加到对象的方法,它应该工作。