在我的情况下,我需要完整的名称和COM端口地址。我有物理串口、USB串口和com0com虚拟串口。
正如所接受的答案建议的那样,我使用WMI调用。 使用
SELECT * FROM Win32_PnPEntity
查找所有设备。 它返回像这样的物理设备,并且可以从
Caption
中解析地址:
Serial Port for Barcode Scanner (COM13)
然而,对于com0com端口,
Caption
是这样的(没有地址):
com0com - serial port emulator
SELECT * FROM Win32_SerialPort
会返回地址 (DeviceID
) 和全名 (Name
),但它只能找到物理串口和com0com端口,无法找到USB串口。
因此,最终需要进行两个WMI调用:SELECT * FROM Win32_SerialPort
(地址为 DeviceID
) 和 SELECT * FROM Win32_PnPEntity WHERE Name LIKE '%(COM%'
(地址可以从 Caption
中解析出来)。我缩小了 Win32_PnPEntity
的范围,因为它只需要找到在第一个调用中未找到的设备。
以下C++代码可用于查找所有串口:
std::map<int, std::wstring> enumerateSerialPorts()
;
ULONG uReturn = 0;
do
try
catch (...)
}
VariantClear(&vtProp);
pclsObj[jj]->Release();
}
}
} while (hres == WBEM_S_NO_ERROR);
pEnumerator->Release();
}
pEnumerator = NULL;
hres = pSvc->ExecQuery(
bstr_t(L"WQL"),
bstr_t(L"SELECT DeviceID, Name FROM Win32_SerialPort"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (SUCCEEDED(hres)) ;
ULONG uReturn = 0;
do
VariantClear(&vtProp1);
VariantClear(&vtProp2);
pclsObj[jj]->Release();
}
}
} while (hres == WBEM_S_NO_ERROR);
pEnumerator->Release();
}
}
pSvc->Release();
}
pLoc->Release();
}
}
CoUninitialize();
}
if (FAILED(hres))
return result;
}
QueryDosDevice()
在搜索 FTDI USB<->Serial 端口设备时非常有效,其他方法都失败了。 - Jon Cage\\.\
,因为它们在NT命名空间中没有保留,并且只能在设备命名空间中访问--https://learn.microsoft.com/ru-ru/windows/desktop/FileIO/naming-a-file#win32-device-namespaces - aitap