Если вам нужно понятное имя, которое обычно включает заключенный в скобки номер com-порта, это должно сделать это:
{
wchar_t friendly_name[128];
if (!SetupDiGetDeviceRegistryPropertyW(device_list, &device_data, SPDRP_FRIENDLYNAME, nullptr, reinterpret_cast<PBYTE>(friendly_name), sizeof friendly_name, nullptr))
return;
StringCopyW(buffer, friendly_name);
}
Чтобы получить два параметра device_list
и device_data
для вышеуказанного вызова, Я использую эту функцию:
void rescan_ports( void )
{
SP_DEVINFO_DATA device_data = { sizeof device_data };
HDEVINFO device_list = SetupDiGetClassDevsW(&GUID_DEVINTERFACE_COMPORT, nullptr, nullptr, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
DWORD error = GetLastError();
if (!device_list && device_list == INVALID_HANDLE_VALUE) return;
bool ended = false;
for( int i = 0; i < 6000 && !ended; i++ ) {
if (SetupDiEnumDeviceInfo(device_list, i, &device_data))
format_and_add_port_detail(device_list, device_data);
else
ended = (GetLastError() == ERROR_NO_MORE_ITEMS);
}
SetupDiDestroyDeviceInfoList(device_list);
}
Это очень похоже на то, что вы написали, за исключением того, что мой использует GUID_DEVINTERFACE_COMPORT
, чтобы найти только последовательные порты.