Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > список портов


Автор: LastAngel 26.2.2009, 13:36
Код

  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 элемент 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)