VC 枚举电脑串口

1.从注册表读取信息:
  代码如下:
  从注册表读取串口

void CCommDlg::EnumCommPort(CListBox *pListBox) 
{ 
	HKEY hKey; 
	if(ERROR_SUCCESS ==::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Hardware\\DeviceMap\\SerialComm",NULL, KEY_READ, &hKey ))//打开串口注册表对应的键值 
	{ 
		int i=0; 
		TCHAR RegKeyName[128],SerialPortName[128];
		DWORD dwLong,dwSize; 
		while(TRUE) 
		{ 
			dwLong = dwSize=sizeof(RegKeyName); 
			if(ERROR_NO_MORE_ITEMS==::RegEnumValue(hKey,i,RegKeyName,&dwLong,NULL,NULL,(PUCHAR)SerialPortName, &dwSize))//枚举串口 
			{
				break; 
			}
			if(!memcmp(RegKeyName,"\\Device\\",8))//过滤虚拟串口
			{
				pListBox->AddString(SerialPortName); //SerialPortName就是串口名字
			}
			i++; 
		}
		if(pListBox->GetCount()==0) 
		{ 
			MessageBox("在HKEY_LOCAL_MACHINE:Hardware\\DeviceMap\\SerialComm里找不到串口!!!"); 
		}
		RegCloseKey(hKey); 
	}
	else
	{
		RegCloseKey(hKey);
		MessageBox("您的计算机的注册表上没有HKEY_LOCAL_MACHINE:Hardware\\DeviceMap\\SerialComm项");
	}
}

2.利用windows SDK 库函数读取硬件信息
  代码如下:
  利用windows SDK 库函数读取硬件信息 

unsigned char CCommDlg::DeviceEnumCommPort(CListBox *pListBox)
{
	HDEVINFO hDevInfo;
	SP_DEVINFO_DATA DeviceInfoData;
	DWORD DeviceIndex;
	//Create a HDEVINFO with all present devices.
	hDevInfo=SetupDiGetClassDevs((LPGUID) &GUID_DEVCLASS_PORTS,0,0,DIGCF_PRESENT);

	/*
	GUID_DEVCLASS_FDC软盘控制器
	GUID_DEVCLASS_DISPLAY显示卡
	GUID_DEVCLASS_CDROM光驱
	GUID_DEVCLASS_KEYBOARD键盘
	GUID_DEVCLASS_COMPUTER计算机
	GUID_DEVCLASS_SYSTEM系统
	GUID_DEVCLASS_DISKDRIVE磁盘驱动器
	GUID_DEVCLASS_MEDIA声音、视频和游戏控制器
	GUID_DEVCLASS_MODEMMODEM
	GUID_DEVCLASS_MOUSE鼠标和其他指针设备
	GUID_DEVCLASS_NET网络设备器
	GUID_DEVCLASS_USB通用串行总线控制器
	GUID_DEVCLASS_FLOPPYDISK软盘驱动器
	GUID_DEVCLASS_UNKNOWN未知设备
	GUID_DEVCLASS_SCSIADAPTERSCSI 和 RAID 控制器
	GUID_DEVCLASS_HDCIDE ATA/ATAPI 控制器
	GUID_DEVCLASS_PORTS端口(COM 和360非主流 LPT)
	GUID_DEVCLASS_MONITOR监视器
	*/

	if (hDevInfo == INVALID_HANDLE_VALUE)
	{
		DWORD ErrorCode = GetLastError();
		// Insert error handling here.
		return 1;
	}
	// Enumerate through all devices in Set.

	DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
	  
	for(DeviceIndex=0;SetupDiEnumDeviceInfo(hDevInfo,DeviceIndex,&DeviceInfoData);DeviceIndex++)
	{
		DWORD DataPropertyType;
		LPTSTR buffer = NULL;
		DWORD buffersize = 0; 
		// 
		// Call function with null to begin with, 
		// then use the returned buffer size 
		// to Alloc the buffer. Keep calling until
		// success or an unknown failure.
		// 
		while (!SetupDiGetDeviceRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_FRIENDLYNAME,&DataPropertyType,(PBYTE)buffer,buffersize,&buffersize))
		{
			DWORD ErrorCode=GetLastError();
			if (ErrorCode == ERROR_INSUFFICIENT_BUFFER)
			{
				// Change the buffer size.
				if (buffer) LocalFree(buffer);
				buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
			}
			else
			{
				// Insert error handling here.
				break;
			}
		}
		CString FriendlyPortName=buffer; /*Extract Serial Port Name*/
		int pos=FriendlyPortName.Find('(');
		CString SerialPortName=FriendlyPortName.Right(FriendlyPortName.GetLength()-pos-1);
		SerialPortName.TrimRight(')');
		pListBox->AddString(SerialPortName);
		if(buffer) 
		{
			LocalFree(buffer);
		} 
	}
	if (GetLastError()!=NO_ERROR && GetLastError()!=ERROR_NO_MORE_ITEMS)
	{
		return 1;
	}
	// Cleanup
	SetupDiDestroyDeviceInfoList(hDevInfo);
	return 0;
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值