Уведомление Mac OS X с одинаковым идентификатором поставщика и разными идентификаторами продукта - PullRequest
0 голосов
/ 10 декабря 2018

Попробовал это решение по ссылке stackfow:

CFMutableDictionaryRef  matchingDict = IOServiceMatching ( kIOUSBDeviceClassName );
if ( matchingDict )
{
    UInt32        usbVendor = k_MyVendorID;
    CFNumberRef   refVendorId = CFNumberCreate ( kCFAllocatorDefault, kCFNumberIntType, &usbVendor );
    CFDictionarySetValue ( matchingDict, CFSTR ( kUSBVendorID ), refVendorId );
    CFRelease ( refVendorID );
    CFDictionarySetValue ( matchingDict, CFSTR ( kUSBProductID ), CFSTR ( "*" ) );   // This is a wildcard, so we find any device.
}

При добавлении нового устройства, похоже, работает:

kr = IOServiceAddMatchingNotification(gNotifyPort,kIOMatchedNotification, matchingDict, RawDeviceAdded, NULL, &gRawAddedIter);

При этом оно либо вылетает, либо список не обновляется,с удалением устройства, кажется, работает.// Уведомление о прекращении:

kr = IOServiceAddMatchingNotification(gNotifyPort, kIOTerminatedNotification, matchingDict, RawDeviceRemoved, NULL, &gRawRemovedIter);

// Уведомление о прекращении:

kr = IOServiceAddMatchingNotification(gNotifyPort, kIOTerminatedNotification, matchingDict, NonRawDeviceRemoved, NULL, &gRawRemovedIter);

Какой лучший способ справиться с этим?

1 Ответ

0 голосов
/ 10 декабря 2018

Вы пытаетесь повторно использовать один и тот же matchingDict для обоих вызовов на IOServiceAddMatchingNotification?Все функции IOServiceAddMatchingNotification и аналогичные выпускают входящий соответствующий словарь, поэтому, если вы хотите использовать его дважды, вы должны CFRetain(matchingDict); один раз, прежде чем начать его использовать.

(Build -> Analyze должен теоретически перехватить)эта ошибка для вас.)

...