背景:
我们有一个使用 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);