背景:
我们有一个使用QT框架编写的应用程序。一个关键要求是我们可以正确检测所使用的 USB闪存驱动器的硬件序列号(不是外部硬盘驱动器)。此功能已正常工作4年,适用于Windows XP,Windows Vista,Windows 2007和所有Mac版本。
令我们惊讶的是,我们让客户抱怨USB硬件ID没有被完全读取和显示。经过广泛测试后发现,只有 Mac OS Mountain Lion + Mac Book(Pro)的组合才能检测到硬件ID。
在迷你Mac上的iMac上的Mountain Lion工作正常。 Leopard,Snow Leopard和Lion适用于所有Mac,包括Mac Book Pro。我们一直在寻找近一个月的修复但没有结果。任何人都可以提供一小段代码,这些代码可以工作或提供导致此问题的信息(实际上只有这个组合)以及如何修复它。
请注意 在互联网上可以找到与山狮有问题的其他USB硬件的几种资源,但是如上所述,没有给出解决方案的答案。
其他信息: 我们现在使用以下代码在除了具有USB3.0端口的Mac之外的所有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);