实现枚举全部com port,和自动根据硬件变动更新com port
代码已上传CSDN : http://download.csdn.net/detail/xuleisdjn/9521866
枚举com port 通过读注册表实现。
根据硬件更新com port通过响应系统消息WM_DEVICECHANGE 实现。
注:在对话框的messages里面,我并没有找到这个消息,需要自己手动添加。
下面列出实现方法。
在界面上添加一个CComboBox控件,并为其添加一个控制变量m_combobox;
在头文件中添加
public:
CComboBox m_combobox;
afx_msg BOOL OnDeviceChange(UINT nEventType,DWORD_PTR dwData);
void FindComPort();
在cpp的message map中添加
BEGIN_MESSAGE_MAP(CcomportDlg, CDialogEx)
ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()
在cpp的DoDataExchange中添加
void CcomportDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO1, m_combobox);
}
在cpp中添加两个函数
BOOL CcomportDlg::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
{
if(nEventType==DBT_DEVNODES_CHANGED)
FindComPort();
return TRUE;
}
注:其中宏定义 DBT_DEVNODES_CHANGED 需要添加头文件 Dbt.h
void CcomportDlg::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;
m_combobox.ResetContent();
while(true)
{
dwLong = dwSize = 256;
if(RegEnumValue(hKey, nCount, szPortName, &dwLong, NULL, NULL, (PUCHAR)szComName, &dwSize)==ERROR_NO_MORE_ITEMS)
break;
m_combobox.InsertString(nCount, szComName);
nCount++;
}
RegCloseKey(hKey);
m_combobox.SetCurSel(0);
}
}
#include <Dbt.h>
在cpp的OnInitDialog 中添加FindcomPort();
// TODO: Add extra initialization here
FindComPort();
经过vs2010的编译在win7系统下运行正常,可以自动获取电脑的所有com 口,当有硬件变动的时候(我用的测试终端,usb接口,会识别通信com口),会自动刷新com 口列表。
代码已上传CSDN : http://download.csdn.net/detail/xuleisdjn/9521866