VC++ 动态检测串口的热插拔(一)通过注册表实现

摘要:
下面介绍如何通过注册表获取可用的串行端口。在HKEY_LOCAL_MACHINE中,一级一级扩展到硬件设备映射串行通信,其中记录了串行端口信息。我们只需读取注册表即可获得串行端口列表。在这里,我们将向您展示读取注册表并在列表框中显示结果的示例。

在上一篇文章中讲述了如何通过循环遍历的方法获取可用串口,可是这样的方法过于暴力,难免会想有没有其他的办法那,嘿嘿,那是肯定会有的,不管什么问题,解决问题的方法永远都不止一种。下面讲述如何通过注册表来获取可用串口。

大家都知道,通过设备管理器我们可以看到可用串口号的列表,windows肯定有自己管理各种设备的方法,那就是大家所熟悉的注册表,注册表中记录各种设备信息以及其他重要信息。在HKEY_LOCAL_MACHINE下逐级展开到Hardware\DeviceMap\SerialComm,这里记录的就是串口信息。只要通过简单的注册表读取操作我们就可以得到串口列表。

这里将展示给大家,通过注册表读取,并将结果展示到列表框中的例子。

1遍历串口源码如下:

OnInitDialog中如下:

BOOL CDetectComDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	DWORD sStyle = m_ListShow.GetExtendedStyle();
	sStyle |= LVS_EX_GRIDLINES;
	sStyle |= LVS_EX_FULLROWSELECT;
	m_ListShow.SetExtendedStyle(sStyle);
	m_ListShow.InsertColumn(0,_T("索引"),LVCFMT_LEFT,100);
	m_ListShow.InsertColumn(1,_T("串口号"),LVCFMT_LEFT,100);
	TraversalCom();
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


TraversalCom()函数如下:

void CDetectComDlg::TraversalCom()
{
	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;
		while(true)
		{
			dwLong	= dwSize	= 256;
			if(RegEnumValue(hKey, nCount, szPortName, &dwLong, NULL, NULL, (PUCHAR)szComName, &dwSize)==ERROR_NO_MORE_ITEMS)
				break;
			CString str;
			str.Format("%d",nCount);
			m_ListShow.InsertItem(nCount,str);
			str.Format(_T("%s "),szComName);
			m_ListShow.SetItemText(nCount,1,str);
			nCount++;
		}
		RegCloseKey(hKey);
		
	}
}


这时再刚登陆窗口时便可罗列出可用串口。

 

2.检测串口的热插拔

这里主要利用Cwnd的ON_WM_DEVICECHANGE消息来处理。
ON_WM_DEVICECHANGE消息在VS是通过手动添加的
因此,首先得手动添加ON_WM_DEVICECHANGE消息:
第一步:在消息映射BEGIN_MESSAGE_MAP(Ctbox_debug_viewDlg, CDialogEx)中添加:

afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);


第二步:在cpp文件中添加函数声明

afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);

第三步:实现

BOOL CDetectComDlg::OnDeviceChange(UINT nEventType,DWORD dwData)
{
	//DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData;
	switch (nEventType)
	{
	case DBT_DEVICEREMOVECOMPLETE://移除设备
	case DBT_DEVICEARRIVAL://添加设备
		ReDetectCom();//刷新列表框的内容
		break;

	default:
		break;
	}
	return TRUE;
}


RefreshCom的内容

void CDetectComDlg::RefreshCom(void)
{
	m_ListShow.DeleteAllItems();
	TraversalCom();
}

至此,通过注册表的方法便已实现。

源码:通过注册表实现

免责声明:文章转载自《VC++ 动态检测串口的热插拔(一)通过注册表实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇运放參数解释及经常使用运放选型多元高斯分布及多元条件高斯分布下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

服务器基础知识

1. 什么是服务器 就像他的名字一样,服务器在网络上为不同用户提供不同内容的信息、资料和文件。可以说服务器就是Internet网络上的资源仓库,正是因为有着种类繁多数量庞大内容丰富的服务器的存在,才使得Internet如此的绚丽多彩。 2. 服务器的种类和功能 (1) WWW服务器(WWW Server) WWW服务器也称为Web服务器(Web Serv...

VC++ 注册表

1.设置随机启动 HKEY hKey; LPCTSTR lpSubKey=_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\"); TCHAR AppPathName[MAX_PATH]; GetModuleFileName(NULL, AppPathName, MAX_PATH);...

(转)测试rootvg卷组的镜像的官方做法

测试rootvg卷组的镜像的官方做法 这篇文档介绍了测试rootvg卷组镜像的方法,此文档仅使用于带有热插拔硬盘的pSeries服务器。由于rootvg卷组包含有AIX操作系统,在做卷组镜像配置上比非rootvg多存在一些限制。因此:1.此文档必须被彻底阅读,因为在文档后面列示的事实可能影响你对rootvg镜像的执行和使用;2.这些信息只在AIX版本4和版...

浏览器DNS解析ip后会缓存

今天把域名从一个ip上面换到另外一个ip上面,结果发现解析后好长时间了,原来的机器上还有量,就想着应该是浏览器DNS解析ip后缓存的问题,缓存失效后应该就不会再解析到原来的机器上了。下面也是别人遇到的同样的问题-------------------------------------------------昨天改IP的时候发现,虽然我新设置的的域名指向已经生...

强人总结的Windows XP实用技巧45条(一)

网上的有关软件应用的小巧和自己的几个,希望对大家有用,如果你有更好的请跟帖子大家共分享!有关注册表修改的,请先备份注册表! 1、 影音文件在xp中无法删除 很多情况下是因为预览功能搞的鬼。开始|运行中输入并执行“REGSVR32 /U SHMEDIA.DLL”,取消息预览。恢复时运行“REGSVR32 SHMEDIA.DLL”。其实就是去掉预览功能。 2...

串口调适

usingSystem; usingSystem.Windows.Forms; usingSystem.IO.Ports; usingSystem.Drawing; usingSystem.IO; usingSystem.Text; usingSystem.Collections; usingSystem.Threading; usingSystem.R...