1

背景:
我们有一个使用 QT 框架编写的应用程序。一个关键要求是我们可以正确检测所使用的USB 闪存驱动器(不是外部硬盘驱动器)的硬件序列号。此功能已正常运行 4 年,适用于 Windows XP、Windows Vista、Windows 2007 和所有 Mac 版本。

令我们惊讶的是,我们有客户抱怨 USB 硬件 ID 没有被完全读取和显示。经过广泛测试,事实证明只有Mac OS mountain Lion + Mac Book (Pro)的组合不会检测到硬件 ID。

在 iMac 和 Mini Mac 上的 Mountain Lion 运行良好。Leopard、Snow Leopard 和 Lion 在所有 Mac 上都能正常工作,包括 Mac Book Pro。

我们一直在寻找修复近 1 个月但没有结果。任何人都可以提供一小段有效的代码或提供导致此问题的原因(实际上仅针对此组合)以及如何解决此问题的信息。

注意 可以在 Internet 上找到与山狮有关的其他 USB 硬件的一些资源,但没有给出解决上述问题的确切答案。

附加信息:我们目前使用以下代码,该代码可在所有 Mac 上正常工作,但具有 USB3.0 端口的 Mac 除外。

matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
if (matchingDict == NULL)
{
    return uret; // fail
}

/* Now we have a dictionary, get an iterator.*/
kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS)
{
    return uret;
}

/* iterate */
/* scan all USB device in Mac machine*/
while ((device = IOIteratorNext(iter)))
{
    int vendorId;
    int productId;
    getVidAndPid(device, &vendorId, &productId);
/*Get USB serial number by CFTypeRef*/
    CFTypeRef  serialNoRef = IORegistryEntryCreateCFProperty(device, CFSTR("USB Serial   Number"), 0, 0);
/*Get USB bsd name by CFStringRef */
    CFStringRef bsdNameRef = (CFStringRef)IORegistryEntrySearchCFProperty(device,  kIOServicePlane,CFSTR(kIOBSDNameKey),kCFAllocatorDefault, kIORegistryIterateRecursively );
    char* bsdName = cfStringRefToCString(bsdNameRef) ;
qDebug() << "bsd Name " << bsdName ;
    if (bsdName != NULL)
    {
           char* serialNo = cfTypeToCString(serialNoRef);
        qDebug() << "serialNo " << serialNo ;
/*Get USB manufacturerRef by CFTypeRef */
        CFTypeRef manufacturerRef =IORegistryEntrySearchCFProperty(device,     kIOServicePlane, CFSTR(kUSBVendorString), kCFAllocatorDefault, 0);
        char* manufacrurer = cfTypeToCString(manufacturerRef);
       qDebug() << "manufacrurer " << manufacrurer ;
    }
    IOObjectRelease(device);
}

/* Done, release the iterator */
 IOObjectRelease(iter);
4

0 回答 0