获取计算机所有串口


     多数涉及串口操作的软件,在让用户选择串口时,只会机械的给出从COM1到COM16的组合框。但实际上可能有大于COM16的串口号,于是想编程来获取实际的串口号再列出来。看起来很难,其实关于串口的信息保存了注册表中,代码如下:


void CPageSetCom::ShowComm()
{
	long  lReg; 
	HKEY  hKey; 
	DWORD  MaxValueLength; 
	DWORD  dwValueNumber; 


	lReg=RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_QUERY_VALUE, &hKey); 
	if(lReg!=ERROR_SUCCESS) 
	{ 
	AfxMessageBox(L"Open Registry Error!\n"); 
	return; 
	} 


	lReg=RegQueryInfoKeyA(hKey, 
	NULL, 
	NULL, 
	NULL, 
	NULL, 
	NULL, 
	NULL, 
	&dwValueNumber, //返回和hKey关联的值 
	&MaxValueLength, 
	NULL, 
	NULL, 
	NULL); 
	if(lReg!=ERROR_SUCCESS) //没有成功 
	{ 
	AfxMessageBox(L"Getting  Info  Error!\n"); 
	return; 
	} 


	LPSTR  pValueName,pCOMNumber; 
	DWORD  cchValueName,dwValueSize=6; 


	for(DWORD  i=0;i < dwValueNumber;i++) 
	{ 
	cchValueName=MaxValueLength+1; 
	dwValueSize=6; 
	pValueName=(LPSTR)VirtualAlloc(NULL,cchValueName,MEM_COMMIT,PAGE_READWRITE); 
	lReg=RegEnumValueA(hKey, 
	i, 
	pValueName, 
	&cchValueName, 
	NULL, 
	NULL, 
	NULL, 
	NULL); 


	if((lReg!=ERROR_SUCCESS)&&(lReg!=ERROR_NO_MORE_ITEMS)) 
	{ 
	AfxMessageBox(L"Enum  Registry  Error or No More Items!\n"); 
	continue; 
	} 


	pCOMNumber=(LPSTR)VirtualAlloc(NULL,6,MEM_COMMIT,PAGE_READWRITE); 
	lReg=RegQueryValueExA(hKey, pValueName, NULL, NULL, (LPBYTE)pCOMNumber, &dwValueSize); 


	if(lReg!=ERROR_SUCCESS) 
	{ 
		AfxMessageBox(L"Can not get the name of the port"); 
		continue; 
	} 
	CString strCommList;
	//AfxMessageBox(pCOMNumber);
	CharToUnicode(pCOMNumber,&strCommList);
	//m_ctlPort.AddString(strCommList);
	BOOL m_bInsert=0;


	if(((CComboBox*)GetDlgItem(IDC_CMBREADERCOM))->GetCount()==0)
		((CComboBox*)GetDlgItem(IDC_CMBREADERCOM))->AddString(strCommList);
	else
	{
		CString strTemp=strCommList;
		strCommList.TrimLeft(L"COM");
		for(int icurrent=0;icurrent<((CComboBox*)GetDlgItem(IDC_CMBREADERCOM))->GetCount();icurrent++)
		{
			CString strCurrent;
			((CComboBox*)GetDlgItem(IDC_CMBREADERCOM))->GetLBText(icurrent,strCurrent);
			strCurrent.TrimLeft(L"COM");
			if(_ttol(strCurrent)>_ttol(strCommList))
			{
				((CComboBox*)GetDlgItem(IDC_CMBREADERCOM))->InsertString(icurrent,strTemp);
				m_bInsert = 1;
				break;
			}
		}
		if(!m_bInsert)
		((CComboBox*)GetDlgItem(IDC_CMBREADERCOM))->InsertString(icurrent,strTemp);
	}


	VirtualFree(pValueName,0,MEM_RELEASE); 
	VirtualFree(pCOMNumber,0,MEM_RELEASE); 
	} 
}
int CharToUnicode(char *pchIn, CString *pstrOut)
{
	int nLen;
    WCHAR *ptch;
    if(pchIn == NULL)
    {
        return 0;
    }
    nLen = MultiByteToWideChar(CP_ACP, 0, pchIn, -1, NULL, 0);
    ptch = new WCHAR[nLen];
    MultiByteToWideChar(CP_ACP, 0, pchIn, -1, ptch, nLen);
    pstrOut->Format(_T("%s"), ptch);
    
    delete [] ptch;
    return nLen;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值