我的应用程序存在问题,该应用程序监视USB总线的更改。具体来说,如果我想获得附加的USB服务列表,我使用下面的代码。奇怪的是,某些用户(并且通常不是我的机器)看不到一个或两个设备。 这些设备会出现在IORegistryExplorer中,并显示已注册。
不能正常运行的机器也运行10.6,也是MacBook Pro。
CFMutableDictionaryRef service_properties = CFDictionaryCreateMutable(NULL,0,NULL,NULL); CFMutableDictionaryRef child_props = CFDictionaryCreateMutable(NULL,0,NULL,NULL);
kr = IOServiceGetMatchingServices(kIOMasterPortDefault,
IOServiceNameMatching("AppleUSBEHCI"), &io_objects);
if(kr != KERN_SUCCESS)
exit(1);
while((io_service= IOIteratorNext(io_objects)))
{
kr = IORegistryEntryCreateCFProperties(io_service, &service_properties, kCFAllocatorDefault, kNilOptions);
io_iterator_t iter;
kr = IORegistryEntryGetChildIterator(io_service, kIOServicePlane, &iter);
io_registry_entry_t child;
while( (child = IOIteratorNext( iter )))
{
kr = IORegistryEntryCreateCFProperties(child, &child_props, kCFAllocatorDefault, kNilOptions );
NSLog(@"%@",child_props);
}
IOObjectRelease(io_service);
}
答案 0 :(得分:2)
你完全匹配错误的东西。您正在匹配Mac中使用的物理控制器(EHCI
,UHCI
,OHCI
)。每当他们发明新的控制器标准时都会失败,例如自2012年以来新Mac中的XHCI
(兼容USB 3)。
您可能想要做的是匹配IOUSBDevice
,即当我想匹配系统中的每个设备时我所做的事情。这也是它在Deva
示例代码中的完成方式。
答案 1 :(得分:0)
事实证明,您需要轮询所有总线类型:
for(i=0;i<3;i++){
if(i==0)kr = IOServiceGetMatchingServices(myMasterPort,
IOServiceNameMatching("AppleUSBEHCI"), &io_objects);
if(i==1)kr = IOServiceGetMatchingServices(myMasterPort,
IOServiceNameMatching("AppleUSBOHCI"), &io_objects);
if(i==2)kr = IOServiceGetMatchingServices(myMasterPort,
IOServiceNameMatching("AppleUSBUHCI"), &io_objects);
if(kr != KERN_SUCCESS)
exit(1);
答案 2 :(得分:0)
我同意杰里米:还有其他可能性,而不是AppleUSBEHCI
也许你可能知道(以防万一):
ioreg -l | grep AppleUSB
应显示计算机上的活动USB状态