C++多种方法枚举串口号

部分方式没结果,思路应该是没错。

//7.
  std::cout << "M8: SetupDiGetClassDevs " << std::endl;
  //HDEVINFO hDevInfoSet = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COMPORT, nullptr, nullptr, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
  HDEVINFO hDevInfoSet = SetupDiGetClassDevs(&GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR, nullptr, nullptr, DIGCF_PRESENT);
  if (hDevInfoSet != INVALID_HANDLE_VALUE)
  {
    int nIndex = 0;
    while (true)
    {
      SP_DEVINFO_DATA spDevInfo;
      spDevInfo.cbSize = sizeof(SP_DEVINFO_DATA);
      if (SetupDiEnumDeviceInfo(hDevInfoSet, nIndex++, &spDevInfo))
      {
        ATL::CRegKey RegKey;
        RegKey.Attach(SetupDiOpenDevRegKey(hDevInfoSet, &spDevInfo, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_QUERY_VALUE));

        unsigned char szSerialPort[256] = { 0 };
        unsigned long szSerialPortSize = sizeof(szSerialPort);
        if (ERROR_SUCCESS == RegKey.QueryStringValue("PortName", (char*)szSerialPort, &szSerialPortSize))
        {
          std::cout << szSerialPort << std::endl;
        }
        RegKey.Detach();
        RegKey.Close();
        continue;
      }
      break;
    }
    SetupDiDestroyDeviceInfoList(hDevInfoSet);
  }


  //6.  //test: win7 no results
  std::cout << "M6: WMI " << std::endl;
  //HRESULT hResult = CoInitialize(nullptr);
  HRESULT hResult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
  if (!FAILED(hResult))
  {
    hResult = CoInitializeSecurity(nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE, nullptr);

    if (!FAILED(hResult))
    {
      IWbemLocator* pLocator = NULL;
      //ATL::CComPtr<IWbemLocator> pLocator;
      hResult = CoCreateInstance(CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<void**>(&pLocator));
      if (!FAILED(hResult))
      {
        IWbemServices* pServices = NULL;
        //ATL::CComPtr<IWbemServices> pServices;
        hResult = pLocator->ConnectServer(L"ROOT\\CimV2", nullptr, nullptr, nullptr, 0, nullptr, nullptr, &pServices);
        if (!FAILED(hResult))
        {
          IEnumWbemClassObject* pClassObject = NULL;
          //ATL::CComPtr<IEnumWbemClassObject> pClassObject;
          hResult = pServices->CreateInstanceEnum(L"Win32_SerialPort", WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_WBEM_COMPLETE, nullptr, &pClassObject);
          if (!FAILED(hResult))
          {
            hResult = WBEM_S_NO_ERROR;
            while (WBEM_S_NO_ERROR == hResult)
            {
              unsigned long nReturned;
              IWbemClassObject* pArrClassObject;
              //ATL::CComPtr<IWbemClassObject> pArrClassObject[10];
              //hResult = pClassObject->Next(WBEM_INFINITE, 10, reinterpret_cast<IWbemClassObject**>(pArrClassObject), &nReturned);
              hResult = pClassObject->Next(WBEM_INFINITE, 1, &(pArrClassObject), &nReturned);
              //hResult = 0x80041003
              if (SUCCEEDED(hResult))
              {
                for (unsigned long i = 0; i < nReturned; i++)
                {
                  VARIANT stVariant;
                  HRESULT hGet = pArrClassObject->Get(L"DeviceID", 0, &stVariant, nullptr, nullptr);
                  if (SUCCEEDED(hGet) && stVariant.vt == VT_BSTR)
                  {
                    /*std::string item = stVariant.bstrVal;
                    if (0 == item.compare(0, 3, "COM"))*/
                    std::cout << stVariant.bstrVal << std::endl;
                  }
                  VariantClear(&stVariant);
                  pArrClassObject->Release();
                }
              }
            }
            pClassObject->Release();
          }
          pServices->Release();
        }
        pLocator->Release();
      }
    }
    CoUninitialize();
  }


  //5.  //test: win7 no results
  std::cout << "M5: ComDBGetCurrentPortUsage " << std::endl;
  HCOMDB hComDB = nullptr;
  if (ERROR_SUCCESS == ComDBOpen(&hComDB))
  {
    unsigned long nComDBBufferSize = 0;
    if (ERROR_SUCCESS == ComDBGetCurrentPortUsage(hComDB, nullptr, 0, CDB_REPORT_BYTES, &nComDBBufferSize))
    {
      unsigned char* szComDBBuffer = new unsigned char[nComDBBufferSize]();
      if (ERROR_SUCCESS == ComDBGetCurrentPortUsage(hComDB, szComDBBuffer, nComDBBufferSize, CDB_REPORT_BYTES, &nComDBBufferSize))
      {
        for (size_t i = 0; i < nComDBBufferSize; i++)
        {
         /* std::string item = szComDBBuffer;
          if (0 == item.compare(0, 3, "COM"))*/
          std::cout << szComDBBuffer << std::endl;
        }
      }
      delete[] szComDBBuffer;
    }
    ComDBClose(hComDB);
  }

  //4.  //test: win7 no results
  std::cout << "M4: EnumPorts " << std::endl;
  unsigned long nNeeded = 0, nPortsSize = 0;
  if (!EnumPorts(nullptr, 2, nullptr, 0, &nNeeded, &nPortsSize))
  {
    unsigned long nError = GetLastError();
    if (RPC_S_SERVER_UNAVAILABLE == nError)
      std::cout << "SERVER_UNAVAILABLE" << std::endl;
    else
      std::cout << "Unknown Error " << nError << std::endl;    
  }
  else
  {
    unsigned char* szEnumPortsBuffer = new unsigned char[nNeeded]();
    if (EnumPorts(nullptr, 2, szEnumPortsBuffer, nNeeded, &nNeeded, &nPortsSize))
    {
      PORT_INFO_2* pPortInfo2 = reinterpret_cast<PORT_INFO_2*>(szEnumPortsBuffer);
      for (size_t i = 0; i < nPortsSize; i++)
      {
        std::string item = pPortInfo2->pPortName;
        if (0 == item.compare(0, 3, "COM"))
          std::cout << item << std::endl;
      }
    }
    delete[] szEnumPortsBuffer;
  }


  //3. 
  std::cout << "M3: QueryDosDevice " << std::endl;
  unsigned long nResultLength = 0;
  unsigned long nBufferLengthTemp = 1024;
  char* szpBuffer = new char[nBufferLengthTemp]();
  do
  {
    nResultLength = QueryDosDevice(nullptr, szpBuffer, nBufferLengthTemp);
    if (0 == nResultLength && ERROR_INSUFFICIENT_BUFFER == GetLastError())
    {
      delete[] szpBuffer;
      nBufferLengthTemp *= 2;
      szpBuffer = new char[nBufferLengthTemp]();
      continue;
    }
    break;
  } while (true);
  char* szpBufferMovable = szpBuffer;
  do
  {
    std::string item = szpBufferMovable;
    if (0 == item.compare(0, 3, "COM"))
      std::cout << item << std::endl;

    nResultLength -= (item.length() + 1);
    szpBufferMovable += (item.length() + 1);
  } while (0 < nResultLength);
  delete[] szpBuffer;


  //2. 
  std::cout << "M2: RegQueryValue " << std::endl;
  ATL::CRegKey RegKey;
  if (ERROR_SUCCESS == RegKey.Open(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", KEY_QUERY_VALUE))
  {
    unsigned long nIndex = 0;
    while (true)
    {
      char szPorts[2048] = { 0 };
      unsigned long nPorts = sizeof(szPorts);
      //一般为 ERROR_ACCESS_DENIED == 5
      //if (ERROR_SUCCESS == RegKey.EnumKey(nIndex++, szPorts, &nPorts))
      if (ERROR_SUCCESS == RegEnumValue(RegKey, nIndex++, szPorts, &nPorts, nullptr, nullptr, nullptr, nullptr))
      {
        char szPortsValue[1024] = { 0 };
        unsigned long nPortsValue = sizeof(szPortsValue);
        if (ERROR_SUCCESS == RegKey.QueryStringValue(szPorts, szPortsValue, &nPortsValue))
        {
          std::cout << szPortsValue << std::endl;
          continue;
        }
      }
      break;
    }
    RegKey.Close();
  }

  //1. 
  std::cout << "M1: CreateFile " << std::endl;
  for (size_t i = 0; i < 256; i++)
  {
    char szPorts[16] = { 0 };
    sprintf(szPorts, "\\\\.\\COM%d", i);
    HANDLE hPorts = CreateFile(szPorts, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
    if (INVALID_HANDLE_VALUE != hPorts)
    { 
      std::cout << szPorts << std::endl;
      CloseHandle(hPorts);
    }
  }

相关头文件库

using namespace std;
#include <string> 
#include <vector>
#include <iostream> 
#include <Windows.h>
#include <atlbase.h>    //ATL::CRegKey
#include <winspool.h>  //EnumPorts
#include <msports.h>  //ComDBOpen
#pragma comment(lib, "msports.lib")
#include <WbemCli.h> //CLSID_WbemLocator 
#pragma comment(lib, "WbemUuid.lib")
#include <setupapi.h> //SetupDiGetClassDevs

原文链接: https://www.cnblogs.com/wjshan0808/p/8934743.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/272921

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 下午11:08
下一篇 2023年2月14日 下午11:09

相关推荐