一種通過登錄檔獲取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