获取电脑中串口名和串口ID
枚举Windows系统上的串行端口(COM端口),并将这些端口的名称和ID(去除了"COM"前缀后的数字部分)存储到两个向量(m_vPortNameList和 m_vPortID)中。之后,它将这些端口名称添加到两个组合框(m_comb_PortList 和m_comb_ScanCodePortList)中。
bool CPortSetting::EnumPort()
{
//使用RegOpenKeyEx函数打开HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\注册表键,
//该键包含了系统上所有串行端口的配置信息。
HKEY hKey;
LPCTSTR data_Set = _T("HARDWARE\\DEVICEMAP\\SERIALCOMM\\");
long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));
if (ret0 != ERROR_SUCCESS)
{
return false;
}
const int nNameSize = 100;
int nNum = 0;
TCHAR szName[nNameSize];
TCHAR szPortName[nNameSize];
LONG Status;
DWORD nIndex = 0;
DWORD nKeyNameSize = sizeof(szName);;
DWORD nPortNameSize = sizeof(szPortName);
DWORD nType;
m_vPortID.clear();
m_vPortNameList.clear();
do
{
//使用RegEnumValue函数枚举该键下的所有值。每个值都代表一个串行端口的配置,
//其中值名通常是端口的名称(如"COM1"),值数据可能包含端口的额外配置信息(但在这个例子中未使 用)。
Status = RegEnumValue(hKey, nIndex++, szName, &nKeyNameSize, NULL, &nType,
(PUCHAR)szPortName, &nPortNameSize);
if ((Status == ERROR_SUCCESS) || (Status == ERROR_MORE_DATA))
{
TSTRING strPortName = szPortName;// 串口名
m_vPortNameList.push_back(strPortName);
//对于每个枚举到的项,代码将值名(即端口名称)添加到m_vPortNameList中,
//并去除"COM"前缀后转换为整数,添加到m_vPortID中。
//注意:ERROR_MORE_DATA通常表示缓冲区太小,无法容纳所有返回的数据。但在这个上下文中,
//它可能不是预期的错误码,因为RegEnumValue的缓冲区大小是预先设定的,并且每次循环都会重置。
TSTRING strPortID = strPortName.replace(strPortName.find(_T("COM")),3,_T(""));
int nID = _wtoi(strPortID.c_str());//串口ID
m_vPortID.push_back(nID);
nNum++;// 串口计数
}
nKeyNameSize = sizeof(szName);
nPortNameSize = sizeof(szPortName);
} while ((Status == ERROR_SUCCESS) || (Status == ERROR_MORE_DATA));
RegCloseKey(hKey);
m_comb_PortList->RemoveAll();
AddComboElement(m_comb_PortList, m_vPortNameList);
//2023.10.25 add 扫码端口号设置
m_comb_ScanCodePortList->RemoveAll();
AddComboElement(m_comb_ScanCodePortList, m_vPortNameList);
return true;
}