How do I get the friendly name of a COM port in Windows?

后端 未结 8 1059
再見小時候
再見小時候 2020-12-05 08:09

I have a GSM modem connected via USB. The modem creates 2 serial ports. The first is automatically attached to the modem, the second shows in Device Manager as \"HUAWEI Mo

8条回答
  •  无人及你
    2020-12-05 08:39

    The C++ version based on @Will Dean answer.

    #include 
    #include 
    #include 
    #include 
    
    void enumerateSerialPortsFriendlyNames()
    {
        SP_DEVINFO_DATA devInfoData = {};
        devInfoData.cbSize = sizeof(devInfoData);
    
        // get the tree containing the info for the ports
        HDEVINFO hDeviceInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS,
                                                   0,
                                                   nullptr,
                                                   DIGCF_PRESENT
                                                   );
        if (hDeviceInfo == INVALID_HANDLE_VALUE)
        {
            return;
        }
    
        // iterate over all the devices in the tree
        int nDevice = 0;
        while (SetupDiEnumDeviceInfo(hDeviceInfo,            // Our device tree
                                     nDevice++,            // The member to look for
                                     &devInfoData))
        {
            DWORD regDataType;
            DWORD reqSize = 0;
    
            // find the size required to hold the device info
            SetupDiGetDeviceRegistryProperty(hDeviceInfo, &devInfoData, SPDRP_HARDWAREID, nullptr, nullptr, 0, &reqSize);
            BYTE* hardwareId = new BYTE[(reqSize > 1) ? reqSize : 1];
            // now store it in a buffer
            if (SetupDiGetDeviceRegistryProperty(hDeviceInfo, &devInfoData, SPDRP_HARDWAREID, ®DataType, hardwareId, sizeof(hardwareId) * reqSize, nullptr))
            {
                // find the size required to hold the friendly name
                reqSize = 0;
                SetupDiGetDeviceRegistryProperty(hDeviceInfo, &devInfoData, SPDRP_FRIENDLYNAME, nullptr, nullptr, 0, &reqSize);
                BYTE* friendlyName = new BYTE[(reqSize > 1) ? reqSize : 1];
                // now store it in a buffer
                if (!SetupDiGetDeviceRegistryProperty(hDeviceInfo, &devInfoData, SPDRP_FRIENDLYNAME, nullptr, friendlyName, sizeof(friendlyName) * reqSize, nullptr))
                {
                    // device does not have this property set
                    memset(friendlyName, 0, reqSize > 1 ? reqSize : 1);
                }
                // use friendlyName here
                delete[] friendlyName;
            }
            delete[] hardwareId;
        }
    }
    

提交回复
热议问题