在項目中用到的,用於枚舉系統註冊表中記錄的所有串口號,該方法好像無法查詢到虛擬的串口,
以下這些代碼均可以在網絡上找到,現在自己只不過將其整理下,免得下次用還得重新查找。
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中即可,作爲一個全局
可見的成員變量。