IOServiceGetMatchingServices () возвращает ноль скрытый итератор после горячего подключения - PullRequest
2 голосов
/ 12 июня 2019

У меня есть библиотека для доступа к USB-устройству, которое регистрируется как HID-устройство и позволяет приложениям Mac выполнять все виды изящных задач (GPIO, I2C и т. Д.).Эту библиотеку можно найти здесь:

https://github.com/codemercs-com/io-warrior-mac

Поскольку я обновил проект до MacOS 10.13 SDK, IOServiceGetMatchingServices () возвращает нулевой объект итератора при вызове из обратного вызова DeviceAdded, ноне возвращает код ошибки.

Я предполагаю, что что-то в IOKit коренным образом изменилось с тех пор, как я первоначально написал эту библиотеку около 2002 года.

Я регистрирую свое подключенное к устройству устройствообратный вызов, подобный следующему:

 result = IOServiceAddMatchingNotification(gNotifyPort,
                                          kIOFirstMatchNotification, matchingDict,
                                          IOWarriorAdded, NULL, &gIOWarriorAddedIter);

Источник

Этот обратный вызов действительно вызывается, когда подключено поддерживаемое устройство, но когда я впоследствии вызываю IOServiceGetMatchingServices, итераторноль, - или, когда другие устройства уже были подключены, содержит только эти устройства, но не те, которые были недавно подключены.

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;
}

Источник

Когдаперебирая доступные устройства при запуске приложения, все устройства обнаруживаются просто отлично.

Есть идеи, что я могу сделать не так, здесь?

...