在项目中用到的,用于枚举系统注册表中记录的所有串口号,该方法好像无法查询到虚拟的串口,
以下这些代码均可以在网络上找到,现在自己只不过将其整理下,免得下次用还得重新查找。
INT_PTR CCOMSET::GetSerialPort(CStringArray &arrCom)
{
arrCom.RemoveAll();
HKEY hkey;
LONG32 lRes = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,_T("HARDWARE\\DEVICEMAP\\SERIALCOMM"),
NULL,KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS|KEY_READ,&hkey);
if (lRes == ERROR_SUCCESS)
{
TCHAR tchKey[MAX_PATH];
TCHAR tchValue[20];
DWORD dwIndex = 0;
DWORD dwType = REG_SZ;
while(lRes == ERROR_SUCCESS)
{
DWORD dwCnt = MAX_PATH;
DWORD dwVCount = 20;
lRes = RegEnumValue(hkey,dwIndex++,tchKey,&dwCnt,NULL,
&dwType,(LPBYTE)tchValue,&dwVCount);
if (lRes == ERROR_SUCCESS)
{
if(dwVCount >0 && dwCnt >0)
arrCom.Add(tchValue);
}
}
}
RegCloseKey(hkey);
return arrCom.GetSize();
}
以上这个函数是将注册表中的串口号的字符串存储到CStringArray中,方便后面使用。
以下就是在combobox中进行使用了,一般要用串口都是在列表框中显示出来然后再进行选择;
void CCOMSET::ScanPort()
{
CStringArray arrayComm;
int i=0;
for (;i<GetSerialPort(arrayComm);i++)
{
((CComboBox*)GetDlgItem(IDC_COMBO_COMSET))->AddString(arrayComm[i]);
}
((CComboBox*)GetDlgItem(IDC_COMBO_COMSET))->SetCurSel(i-1);
}
当选择好了之后,就可以将所选的串口号存储在类成员变量中,
if (m_nComIndex>=0)
{
int selePort = m_cbPortSel.GetCurSel();
CString str,temp;
m_cbPortSel.GetLBText(selePort,str);
temp = str.Right(strlen(str)-3);
m_nPortNum = atoi(temp);
m_nComIndex = m_nPortNum;
}
由于我是将串口选择单独放在一个DLG中,所以选择完毕回到主界面后,再在其中将此处的ComNum赋值给mainframe中即可,作为一个全局
可见的成员变量。