Macos IOServiceGetMatchingServices()在热插拔后返回nil hid迭代器
我正在维护一个用于访问USB设备的库,该设备将自身注册为HID设备,并使Mac应用程序能够执行各种漂亮的功能(GPIO、I2C等)。此库可在以下位置找到: 由于我将项目升级到MacOS 10.13 SDK,当从Macos IOServiceGetMatchingServices()在热插拔后返回nil hid迭代器,macos,iokit,Macos,Iokit,我正在维护一个用于访问USB设备的库,该设备将自身注册为HID设备,并使Mac应用程序能够执行各种漂亮的功能(GPIO、I2C等)。此库可在以下位置找到: 由于我将项目升级到MacOS 10.13 SDK,当从DeviceAdded回调调用IOServiceGetMatchingServices()时,返回一个nil迭代器对象,但不返回错误代码 我的假设是,自从我在2002年左右开始编写这个库以来,IOKit中的某些内容已经发生了根本性的变化 我正在注册我的“设备插入”回调,如下所示: re
DeviceAdded
回调调用IOServiceGetMatchingServices()时,返回一个nil迭代器对象,但不返回错误代码
我的假设是,自从我在2002年左右开始编写这个库以来,IOKit中的某些内容已经发生了根本性的变化
我正在注册我的“设备插入”回调,如下所示:
result = IOServiceAddMatchingNotification(gNotifyPort,
kIOFirstMatchNotification, matchingDict,
IOWarriorAdded, NULL, &gIOWarriorAddedIter);
当插入受支持的设备时,确实会调用此回调,但当我随后调用IOServiceGetMatchingServices时,迭代器为nil,--或者,当其他设备已连接时,仅包含这些设备,而不包含新插入的设备
io_iterator_t IOWarriorFindHIDDevices ()
{
CFMutableDictionaryRef hidMatchDictionary = IOWarriorSetUpHIDMatchingDictionary ();
// Set up matching dictionary to search the I/O Registry for HID devices we are interested in. Dictionary reference is NULL if error.
if (NULL == hidMatchDictionary) {
PrintErrMsg ("Couldn't create a matching dictionary.");
return 0;
}
io_iterator_t hidObjectIterator;
// Now search I/O Registry for matching devices.
IOReturn ioReturnValue = IOServiceGetMatchingServices (kIOMasterPortDefault, hidMatchDictionary, &hidObjectIterator);
if (ioReturnValue != kIOReturnSuccess) {
PrintErrMsgIfIOErr(ioReturnValue, "IOServiceGetMatchingServices returned error");
return 0;
}
if (hidObjectIterator == 0) {
PrintErrMsg("IOServiceGetMatchingServices returned nil hidObjectIterator");
return 0;
}
return hidObjectIterator;
}
当在应用程序启动时遍历可用设备时,所有设备都会被很好地发现
你知道我做错了什么吗 我不知道这些iokitapi有什么变化。我唯一能想象的是,您的代码中有一个对象保留/释放错误,特别是在匹配字典上,例如,
ioservice getmatchingservices
使用引用。你有没有在代码上运行过叮当作响的静态分析器?如果没有找到任何东西,我会尝试运行内存诊断,例如zombie对象,看看是否找到任何东西。还要注意,IOServiceAddMatchingNotification
返回的迭代器将为回调中的任何热插拔设备提供ioservice对象,无需每次调用IOServiceGetMatchingServices
。如果您的IOServiceGetMatchingServices()
和IOServiceAddMatchingNotification
的匹配词典不同,我也会在那里查找问题。在最新版本的macOS中,USB和HID类已经发生了一些变化,苹果正在逐步取消向后兼容层。