在項目中選擇串口號的方法

在項目中用到的,用於枚舉系統註冊表中記錄的所有串口號,該方法好像無法查詢到虛擬的串口,

以下這些代碼均可以在網絡上找到,現在自己只不過將其整理下,免得下次用還得重新查找。

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中即可,作爲一個全局

可見的成員變量。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章