获取电脑中串口名和串口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;
- }
-