1. 程式人生 > >MFC程式自動檢測可用串列埠的方法

MFC程式自動檢測可用串列埠的方法

步驟

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()函式枚舉出來的串列埠為系統所有可用串列埠的集合。如何從中找出發生熱拔插的那個串列埠,還需要對可用串列埠佇列做動態分選,分選演算法這裡就不贅述了。