void CEnumComDlg::FindComPort()
{
HKEY hKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Hardware\\DeviceMap\\SerialComm"), NULL, KEY_READ, &hKey)==ERROR_SUCCESS)
{
TCHAR szPortName[256], szComName[256];
DWORD dwLong, dwSize;
int nCount = 0;
CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO_COM);
pCombo->ResetContent();
while(true)
{
dwLong = dwSize = 256;
if(RegEnumValue(hKey, nCount, szPortName, &dwLong, NULL, NULL, (PUCHAR)szComName, &dwSize)==ERROR_NO_MORE_ITEMS)
break;
pCombo->InsertString(nCount, szComName);
nCount++;
}
RegCloseKey(hKey);
pCombo->SetCurSel(0);
}
}
BOOL CEnumComDlg::OnDeviceChange(UINT nEventType, DWORD_PTR dwData) { if(nEventType==DBT_DEVNODES_CHANGED) FindComPort(); return TRUE; }
到这里应该说我们已经很好的解决了枚举串口这个问题,我做了一个简单的小例子,以上代码皆取自这个例子,有兴趣的朋友可以到我的资源里下载。此外,作为问题补充这里再提一下类似问题在windowsCE下如何处理。CE下提供了一组更通用硬件操作接口函数FindFirstDevice、FindNextDevice,这些函数和具有相似名字的文件操作函数的使用方法类似,可以访问所有系统设备,以下代码实现了我上面实现的功能,仅供大家参考。
DEVMGR_DEVICE_INFORMATION ddiFind = {0}; ddiFind.dwSize = sizeof(DEVMGR_DEVICE_INFORMATION); HANDLE hDevFind = FindFirstDevice(DeviceSearchByLegacyName, L"COM*", &ddiFind); CString strCom; m_comboComList.ResetContent(); do { strCom = ddiFind.szLegacyName; strCom = strCom.Left(strCom.GetLength()-1); m_comboComList.AddString(strCom); }while(FindNextDevice(hDevFind, &ddiFind)); if(hDevFind!=INVALID_HANDLE_VALUE) FindClose(hDevFind);