1. 程式人生 > >一種通過登錄檔獲取USB虛擬串列埠埠號的方法

一種通過登錄檔獲取USB虛擬串列埠埠號的方法

在開發一個Modbus的串列埠監測工具軟體的時候,啟動工具軟體,希望一開始就能在下拉框檢測到當前有效的USB串列埠。

剛開始做的時候是用的窮舉法,就是“COM0”~“COM15”一個一個嘗試開啟。但是,這樣做一個是效率低下,另一個是換了新的USB-串列埠介面卡,有可能虛擬串列埠埠號超過了COM15,這樣就找不到可用串列埠了。網上查找了資料,通過讀取windows登錄檔的方式,很好解決了這個問題。

void CSerialCtrlDemoDlg::GetAllCom(void)
{
	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("Please check comport!\n"); 
	  return; 
	} 

	lReg=RegQueryInfoKeyA(  hKey, 
							NULL, 
							NULL, 
							NULL, 
							NULL, 
							NULL, 
							NULL, 
							&dwValueNumber, //返回和hKey關聯的值 
							&MaxValueLength, 
							NULL, 
							NULL, 
							NULL); 
	if( lReg != ERROR_SUCCESS )  
	{	//沒有成功
		AfxMessageBox("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("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("Can not get the name of the port"); 
			continue; 
		} 

		CString strCommList;
		
		//CharToUnicode(pCOMNumber,&strCommList);
		strCommList.Format("%s", pCOMNumber);

		BOOL m_bInsert=0;
  
		if( ((CComboBox*)GetDlgItem(IDC_COMBO_SN))->GetCount() == 0 )
			((CComboBox*)GetDlgItem(IDC_COMBO_SN))->AddString(strCommList);
		else
		{
			CString strTemp=strCommList;
			strCommList.TrimLeft("COM");

			int icurrent;

			for( icurrent=0; icurrent<((CComboBox*)GetDlgItem(IDC_COMBO_SN))->GetCount(); icurrent++ )
			{
				CString strCurrent;

				((CComboBox*)GetDlgItem(IDC_COMBO_SN))->GetLBText(icurrent,strCurrent);

				strCurrent.TrimLeft("COM");
				if( _ttol(strCurrent) > _ttol(strCommList) )
				{
					((CComboBox*)GetDlgItem(IDC_COMBO_SN))->InsertString(icurrent,strTemp);
					m_bInsert = 1;

					break;
				}
			}

			if(!m_bInsert)
				((CComboBox*)GetDlgItem(IDC_COMBO_SN))->InsertString(icurrent,strTemp);
		}

		 VirtualFree(pValueName,0,MEM_RELEASE); 
		 VirtualFree(pCOMNumber,0,MEM_RELEASE); 
	} 
}

 

相關推薦

通過獲取USB虛擬串列方法

在開發一個Modbus的串列埠監測工具軟體的時候,啟動工具軟體,希望一開始就能在下拉框檢測到當前有效的USB串列埠。 剛開始做的時候是用的窮舉法,就是“COM0”~“COM15”一個一個嘗試開啟。但是,這樣做一個是效率低下,另一個是換了新的USB-串列埠介面卡,有可能虛擬串

C++ 通過獲取Windows版本資訊

原理:通過訪問登錄檔 HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion 下的鍵值資訊來獲取windows版本資訊。由於是訪問登錄檔獲取的資訊,所以準確性一般。 #include <

通過Windows獲取U盤、行動硬碟和USB讀卡器等裝置的PID、VID和序列

    當U盤、行動硬碟和USB讀卡器等裝置插入計算機USB介面,Windows會對其進行解析和相關資料記錄,這也是為什麼很多裝置第一次插入計算機時需要較長的時間識別、安裝驅動後,才會出現碟符,而第二次插入則識別速度快了很多。這些裝置的相關資訊記錄在Windows的登錄檔中

VC++ 動態檢測串列的熱插拔()通過實現

在上一篇文章中講述瞭如何通過迴圈遍歷的方法獲取可用串列埠,可是這樣的方法過於暴力,難免會想有沒有其他的辦法那,嘿嘿,那是肯定會有的,不管什麼問題,解決問題的方法永遠都不止一種。下面講述如何通過登錄檔來獲取可用串列埠。 大家都知道,通過裝置管理器我們可以看到可用串列埠號的

通過修改鍵盤

本人電腦聯想E550,出於程式設計師的職業實在無法忍受Home與End鍵不與方向鍵挨在一起,而與方向鍵挨著的是PgUp和PgDn。經過研究,瞭解到可以通過修改登錄檔檔案來修改鍵盤按鍵。有兩種方法可以完美解決這個問題,不過這兩種方法的本質是一樣的。 方法一:手動修改登錄檔來改鍵 普及一個概

win7下通過修改MAC的方法

步驟1:執行【開始】丨【執行】命令,在彈出的【執行】對話方塊中輸入regedit.單擊【確定】按鈕,開啟登錄檔編輯器,如圖1所示。   圖1  登錄檔編輯器 2 步驟2:依次選擇H

Win10系統修改通過修改網絡卡mac地址

 win+R快捷鍵->輸入regedit開啟登錄檔 定位到  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Control\Class \{4D36E972-E325-11CE-BFC1-08002BE10318}\

如何通過修改預設程式

小背景 自從上次修改了登錄檔之後,不知道是手誤還是其他原因,每次開啟pdf的時候都要選擇開啟程式,就比較麻煩,於是就想通過window10 自帶的修改預設程式的元件進行修改,然並卵。只好開拓新思路----用登錄檔來改。 系統引數 window10 64位 專業版 詳

批處理 修改 禁用USB

       需要禁用本機USB介面。可通過修改登錄檔來實現,最簡單的方式就是用批處理執行。 首先 HKLM\SYSTEM\CurrentControlSet\services\USBSTOR 下Start值該為4後,USB裝置不可使用。下面就用兩種簡單惡批處理來實現修改登錄

windows從獲取ip配置資訊

DNS的獲取方式有多種: 這裡提供一種方式是從登錄檔獲取的: 在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Adapters可以獲取網絡卡的SettingID, //HKEY_

通過檢測本機串列資訊

用QT做上位機,使用串列埠通訊時,想自動掃描串列埠裝置,即在下拉列表框中,只顯示已有的串列埠。 本來挺簡單的,只要輪詢HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM就能找到已有的串列埠,但QT的QSettings有個bug,

MFC中根據獲取串列

HANDLE hComm = CreateFile(Com_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);//sett DCB DCB dcb

讀取獲取Windows系統XP/7/8/10型別

        很多方案是採用GetVersion、GetVersionEx這兩個API來查詢作業系統的版本號來判斷當前的作業系統是Windows系列中的哪個,在Win10沒有出現前,這種方法是行的通的,但是Win10出現後此方法對於判斷Win10就不準了。        

通過設定預設印表機的方法

  //獲取預設印表機 BOOL CPrinterInfo::GetTheDefaultPrinterByReg() {  //通過登錄檔,獲取預設的印表機配置  HKEY defaultKey;  DWORD bufferSize = 255;  TCHAR *print

通過檔案進行配置WSUS自動更新

對於工作組環境,無法像域環境那樣通過配置將變動直接應用給大量的客戶端。為了簡化操作,可以針對自己搭建的WSUS伺服器,編寫包含伺服器相關資訊的.reg檔案,然後合併到所有的客戶端計算機上。但這並非最佳的解決辦法,因為在登錄檔檔案中可包含的資訊並不像組策略設定那麼豐富,而且依

win10 此電腦顯示多餘的資料夾通過去除

win10 的此電腦,就是win7的計算機位置多了6個資料夾出來,說實話這個很不友好,因為如果資料夾沒有全屏那麼下面的磁碟會被遮擋住,讓人很有些不爽。其實右邊還好一些,可以點選收起將資料夾部分收起來,但是左側導航欄就不可以,沒有分類,也沒有部分收起的功能。所以我

通過遮蔽WIN+L、登出、切換使用者等

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System] "DisableLockWorkstation"=dword:00000001 "DisableTaskMgr"=d

遷移桌面程式到MS Store(15)——通過開啟Developer Mode

沒想到該系列不僅沒有太監,還打算更新一個小短篇。在各種大廠小廠工作的各位想必都知道Windows域的概念。入域機器的設定由不得登入所用的域賬號,Windows的更新和安全等眾多的設定均被鎖定,由域管理員掌控。聞道有先後,術業有專攻。域管理員往往不懂軟體開發,公司統一的Group Policy設定也不會額外針對

安裝pywin32時中無Python3.6安裝路徑解決方法

在安裝pywin32時,出現Python Version 3.6.4 required which was not found in the registry的時候登錄檔中沒有Python3.6.4的安裝路徑。  解決方法: 1.寫一個python檔案,執行即可,在網上找到了登錄檔註冊

VC獲取本機IP、子網掩碼、閘道器、計算廣播地址等資訊程式碼(通過)

// code by xiujie , bbs.xiujie.cn#pragma comment(lib, "ws2_32.lib")#include <iostream>#include <cstdlib>#include <string&g