我正在维护一个用于访问USB设备的库,该设备将自身注册为HID设备,并使Mac应用程序能够执行各种漂亮的操作(GPIO,I2C等)。该库可以在这里找到:
https://github.com/codemercs-com/io-warrior-mac
自从我将项目升级到MacOS 10.13 SDK后,从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;
}
在应用程序启动时遍历可用设备时,发现所有设备都很好。
任何想法,我可能在做什么错,在这里?