宽字节版本
void enumerate_serial_ports() {
HDEVINFO deviceInfoSet = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, NULL, NULL, DIGCF_PRESENT);
if (deviceInfoSet == INVALID_HANDLE_VALUE)
return;
SP_DEVINFO_DATA deviceInfoData;
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoSet, i, &deviceInfoData); i++) {
HKEY hDeviceKey = SetupDiOpenDevRegKey(deviceInfoSet, &deviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
if (hDeviceKey != INVALID_HANDLE_VALUE) {
DWORD dwType, dwSize = 0;
wchar_t portName[256];
dwSize = sizeof(portName);
if (RegQueryValueEx(hDeviceKey, L"PortName", NULL, &dwType, (LPBYTE)portName, &dwSize) == ERROR_SUCCESS) {
if (dwType == REG_SZ) {
wchar_t deviceName[256];
if (SetupDiGetDeviceRegistryProperty(deviceInfoSet, &deviceInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)deviceName, sizeof(deviceName), NULL)) {
wprintf(L"%ls (%ls)\n", deviceName, portName);
}
}
}
RegCloseKey(hDeviceKey);
}
}
SetupDiDestroyDeviceInfoList(deviceInfoSet);
}
多字节版本
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#include <stdio.h>
#pragma comment(lib, "setupapi.lib")
void enumerate_serial_ports() {
HDEVINFO deviceInfoSet = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, NULL, NULL, DIGCF_PRESENT);
if (deviceInfoSet == INVALID_HANDLE_VALUE)
return;
SP_DEVINFO_DATA deviceInfoData;
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoSet, i, &deviceInfoData); i++) {
HKEY hDeviceKey = SetupDiOpenDevRegKey(deviceInfoSet, &deviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
if (hDeviceKey != INVALID_HANDLE_VALUE) {
DWORD dwType, dwSize = 0;
char portName[256];
dwSize = sizeof(portName);
if (RegQueryValueExA(hDeviceKey, "PortName", NULL, &dwType, (LPBYTE)portName, &dwSize) == ERROR_SUCCESS) {
if (dwType == REG_SZ) {
char deviceName[256];
if (SetupDiGetDeviceRegistryPropertyA(deviceInfoSet, &deviceInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)deviceName, sizeof(deviceName), NULL)) {
printf("%s (%s)\n", deviceName, portName);
}
}
}
RegCloseKey(hDeviceKey);
}
}
SetupDiDestroyDeviceInfoList(deviceInfoSet);
}