背景:
QTフレームワークを使用して作成されたアプリケーションがあります。重要な要件の1つは、使用されているUSBフラッシュドライブ(外付けハードドライブではない)のハードウェアシリアル番号を正しく検出できることです。この機能は4年間正しく機能しており、Windows XP、Windows Vista、Windows 2007、およびすべてのMacバージョンで機能します。
驚いたことに、USBハードウェアIDが完全に読み取られて表示されていないという苦情がクライアントに寄せられました。徹底的にテストした結果、 Mac OS Mountain Lion + Mac Book(Pro)の組み合わせのみがハードウェアIDを検出しないことが判明しました。
iMac、MiniMacのMountainLionは正常に動作します。Leopard、Snow Leopard、Lionは、MacBookProを含むすべてのMacで正常に動作します。
私たちはほぼ11か月間修正を探していましたが、結果はありませんでした。誰かが機能する小さなコードを提供したり、この問題の原因(そして実際にはこの組み合わせでのみ)とそれを修正する方法についての情報を提供できますか?
注マウンテンライオンに問題がある他の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);