C++ 如何创建一个程序来列出Mac中的所有USB设备?
我对MacOSX操作系统的接触有限,现在我已经开始使用Xcode,正在研究I/O工具包。我需要在命令行工具下的Xcode中创建一个程序,以便列出Mac系统中连接的所有USB设备。有此经验者请帮助我。如果有人能给我提供示例代码,那么它将非常有用,因为我正在寻找起点。如果您运行C++ 如何创建一个程序来列出Mac中的所有USB设备?,c++,xcode,macos,iokit,C++,Xcode,Macos,Iokit,我对MacOSX操作系统的接触有限,现在我已经开始使用Xcode,正在研究I/O工具包。我需要在命令行工具下的Xcode中创建一个程序,以便列出Mac系统中连接的所有USB设备。有此经验者请帮助我。如果有人能给我提供示例代码,那么它将非常有用,因为我正在寻找起点。如果您运行system\u profiler SPUSBDataType它将列出连接到系统的所有USB设备,然后,您可以通过将数据转储到文本文件或从命令中将其读入应用程序并在应用程序中使用来与该数据交互。您只需访问IOKit注册表即可。
system\u profiler SPUSBDataType
它将列出连接到系统的所有USB设备,然后,您可以通过将数据转储到文本文件或从命令中将其读入应用程序并在应用程序中使用来与该数据交互。您只需访问IOKit注册表即可。您完全可以使用ioreg
工具来执行此操作(例如,通过system()
或popen()
运行它)。如果没有,那么您至少可以使用它来验证您的代码:
有关ioreg
工具的信息:
$ man ioreg
获取USB设备列表:
$ ioreg -Src IOUSBDevice
您可以根据自己的需要进行调整,示例将设置通知程序,列出当前连接的设备,然后等待设备连接/分离。如果这样做,您将希望删除usbvendo
和usbProduct
匹配字典,以便所有USB设备都匹配
或者,您可以使用由IOServiceMatching(kIOUSBDeviceClassName)
创建的字典来获取所有当前匹配服务的迭代器
下面是一个简短的示例(我从未运行过):
#包括
#包括
int main(int argc,const char*argv[]
{
CFMutableDictionaryRef匹配dict;
io迭代器iter;
kern_return_t kr;
io_服务_t设备;
/*为类设置匹配的词典*/
matchingDict=IOServiceMatching(kIOUSBDeviceClassName);
if(matchingDict==NULL)
{
返回-1;//失败
}
/*现在我们有一个字典,得到一个迭代器*/
kr=IOServiceGetMatchingServices(kiomaterportdefault、matchingDict和iter);
if(kr!=KERN_SUCCESS)
{
返回-1;
}
/*迭代*/
而((device=IOIteratorNext(iter)))
{
/*对设备做些什么,例如检查属性*/
/* ... */
/*并在继续下一项之前释放引用*/
IOObjectRelease(装置);
}
/*完成后,释放迭代器*/
国际热核实验堆;
返回0;
}
谢谢您的帮助。这将非常有助于验证。但是我需要一个用xcode(c++)编写的程序来列出usb设备。您是否阅读了有关使用system()
或popen()
从代码中执行ioreg工具的部分?我阅读了。但我渴望得到豪斯图尔肯给出的代码。这也很有用。但是如果你像我说的那样给出一些示例代码,那将是最好的。谢谢你的帮助。这是非常有用的,这是类似于我所寻找的。当我构建它时,但是这个代码显示了错误:像IORReVIEGETMatCHIGIN服务,从……ION ObjeTrError中引用的类似错误,SyIORVICOMATION,YOIORATAREXTRONT,KIOMASTARPORTAULL……我在XCODEL >命令行工具->标准C++下创建了一个项目。如果你能帮忙,我将非常感谢你,感谢你在建造过程中犯下的错误。。。。。。。。。。。。。。。。。未定义的符号:“_kiomaterportdefault”,引用自:_kiomaterportdefault$non_lazy_ptr in main.o”_IOServiceGetMatchingServices,引用自:_mainin main.o“_IOObjectRelease”,引用自:_mainin main.o _mainin main.o”_ioservice匹配,引用自:_mainin.o“\u IOIteratorNext”,引用自:\u main in main.o ld:symbol未找到collect2:ld返回1个退出状态您需要使用I/o工具包框架(即IOKit.framework
)和您的项目中的核心基础框架,或者这将不链接。/**显示设备名称**/……IONAMAMEYT DeVICENAMEL;KR= IORGIGSTRY EngyIGETNITY(设备,DeVICENAMEY);如果(KNNURION!=KR){DeVICENAME[0 ]=‘0’;}PrtTf(“\nDeVICENAME:%S”,DeiCeNeNe)这给了我设备名称…现在我正在寻找一个动态的程序,它也显示设备的连接和分离…请help@DILi:查看我链接到的USBPrivateDataSample,它使用附加/分离通知。
#include <IOKit/IOKitLib.h>
#include <IOKit/usb/IOUSBLib.h>
int main(int argc, const char *argv[])
{
CFMutableDictionaryRef matchingDict;
io_iterator_t iter;
kern_return_t kr;
io_service_t device;
/* set up a matching dictionary for the class */
matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
if (matchingDict == NULL)
{
return -1; // fail
}
/* Now we have a dictionary, get an iterator.*/
kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS)
{
return -1;
}
/* iterate */
while ((device = IOIteratorNext(iter)))
{
/* do something with device, eg. check properties */
/* ... */
/* And free the reference taken before continuing to the next item */
IOObjectRelease(device);
}
/* Done, release the iterator */
IOObjectRelease(iter);
return 0;
}