枚举所有串口,并自动识别硬件变动

来源:互联网 发布:静态sql和动态sql区别 编辑:程序博客网 时间:2024/04/29 19:00

实现枚举全部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

0 0
原创粉丝点击