gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:20:01 46 4
gpt4 key购买 nike

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

IOHIDManagerRegisterDeviceMatchingCallback( gIOHIDManagerRef, Handle_DeviceMatchingCallback, NULL);

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

迈克尔

最佳答案

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

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

  • contextctx
  • refcon(“引用常量”)
  • 用户数据
  • 用户信息

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

您正在使用的 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];
}

关于c - IOHIDManagerRegisterDeviceMatchingCallback这个函数在cocoa环境下运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1772349/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com