MFC程式自動檢測可用串列埠的方法
阿新 • • 發佈:2018-12-29
步驟
1、 標頭檔案新增宣告。
protected:
//實現串列埠熱插拔
afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);
2、原始檔新增訊息對映。
BEGIN_MESSAGE_MAP(CFixtureConfig, CDialog)
ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()
3、原始檔新增程式碼實現。
BOOL CFixtureConfig::OnDeviceChange(UINT nEventType, DWORD dwData) { switch (nEventType) { //串列埠被移除 case DBT_DEVICEREMOVECOMPLETE: //串列埠插入或者變為有效 case DBT_DEVICEARRIVAL: EnumSerialPort(m_saTmpCom); break; default: break; } return TRUE; }
4、列舉串列埠。
a、登錄檔列舉法。
BOOL CFixtureConfig::EnumSerialPort(CStringArray &saCom) { HKEY hKey; DWORD dwIndex; LONG lResult; DWORD dwType; DWORD dwKeyNameLen; CHAR szKeyName[256]; DWORD dwKeyDataLen; UCHAR szKeyData[80]; CString strCom, str; LPCTSTR lpSubKey; saCom.RemoveAll(); lpSubKey = _T("HARDWARE\\DEVICEMAP\\SERIALCOMM\\"); lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &hKey); if (lResult != ERROR_SUCCESS) { str.Format(_T("[Main] RegOpenKeyEx()函式開啟失敗!")); AfxMessageBox(str); return FALSE; } dwIndex = 0; while(1) { memset(szKeyName, 0x0, sizeof(szKeyName)); memset(szKeyData, 0x0, sizeof(szKeyData)); dwKeyNameLen = sizeof(szKeyName); dwKeyDataLen = sizeof(szKeyData); lResult = RegEnumValue(hKey, dwIndex ++, szKeyName, &dwKeyNameLen, NULL, &dwType, szKeyData, &dwKeyDataLen); if ((lResult == ERROR_SUCCESS) || (lResult == ERROR_MORE_DATA)) { strCom = (char *)szKeyData; saCom.Add(strCom); } else { break; } } RegCloseKey(hKey); return true; }
b、窮舉遍歷法。
5、備註:EnumSerialPort()函式枚舉出來的串列埠為系統所有可用串列埠的集合。如何從中找出發生熱拔插的那個串列埠,還需要對可用串列埠佇列做動態分選,分選演算法這裡就不贅述了。