#include <map>
#include <string>
#include <tchar.h>
#include <windows.h>
#ifdef UNICODE
#define _tstring std::wstring
#else
#define _tstring std::string
#endif
// 串口信息
typedef struct _COMM_INFO
{
_tstring strName;
_tstring strPath;
_tstring strValueName;
int commNumber;
_COMM_INFO() : commNumber(0) {}
}COMM_INFO;
// 获取系统中串口列表
std::map<int, COMM_INFO> GetSerialsList()
{
std::map<int, COMM_INFO> mapResult;
HKEY hKey = NULL;
LSTATUS nStatus = ERROR_SUCCESS;
nStatus = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Hardware\\DeviceMap\\SerialComm"), NULL, KEY_READ, &hKey);
if (nStatus == ERROR_SUCCESS)
{
TCHAR szValueName[MAX_PATH];
TCHAR szTypeName[MAX_PATH];
TCHAR szPortData[MAX_PATH];
DWORD dwCchValueName = 0;
DWORD dwCbData;
DWORD dwIndex = 0;
while (true)
{
dwCchValueName = _countof(szValueName);
dwCbData = sizeof(szPortData);
nStatus = ::RegEnumValue(hKey, dwIndex, szValueName, &dwCchValueName, NULL, NULL, (PUCHAR)szPortData, &dwCbData);
if (ERROR_NO_MORE_ITEMS == nStatus)
{
break;
}
else
{
int commNumber = 0;
if (1 == _stscanf_s(szPortData, _T("COM%d"), &commNumber))
{
COMM_INFO info;
info.commNumber = commNumber;
info.strValueName = szValueName;
info.strName = szPortData;
info.strPath = _T(R"(\\.\)");
info.strPath += szPortData;
mapResult.insert(std::make_pair(commNumber, info));
}
}
dwIndex++;
}
::RegCloseKey(hKey);
}
return mapResult;
}
int main()
{
std::map<int, COMM_INFO> mapResult = GetSerialsList();
return 0;
}
