| Код | HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; SP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData; hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE) { return ; } DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); DeviceInterfaceDetailData.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++) { DWORD dwData; char* buffer = new char[100]; DWORD buffersize = 0; while (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, &dwData, (PBYTE)buffer, buffersize, &buffersize)) { if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) { if (buffer) delete [] buffer; buffer = new char [buffersize]; } else { break; } }
if(SetupDiEnumDeviceInterfaces(hDevInfo, &DeviceInfoData, &GUID_DEVCLASS_PORTS, i, &DeviceInterfaceData)) { DWORD requiredSize = 0; SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, NULL, 0, &requiredSize, NULL );
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) { SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, &DeviceInterfaceDetailData, requiredSize, NULL, &DeviceInfoData);
requiredSize = 0; SetupDiGetDeviceRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_FRIENDLYNAME,NULL,NULL,0,&requiredSize); CHAR* pBuffer = new CHAR[requiredSize+1]; SetupDiGetDeviceRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_FRIENDLYNAME,NULL,(UCHAR*)pBuffer,requiredSize,NULL); } } else { // GetLastError(); }
if (buffer) delete[]buffer; } SetupDiDestroyDeviceInfoList(hDevInfo);
|
Такая вот проблемка, на компе есть 1 порт на мамке не выведенный, 1 через usb переходник и два виртуальных ... когда SetupDiGetClassDevs имеет флаг DIGCF_PRESENT, SetupDiEnumDeviceInfo выдает все 4 , но SetupDiEnumDeviceInterfaces говорит что нету элементов(ERROR_NO_MORE_ITEMS). Если флаг стоит DIGCF_PRESENT | DIGCF_DEVICEINTERFACE то выдается только 1 порт который на мамке и SetupDiEnumDeviceInterfaces срабатывает возвращая его имя (COMX). Не пойму почему имена остальных он не хочет выводить ... и почему вообще SetupDiEnumDeviceInfo с такими флагами выдает только 1 элемент |