1. 程式人生 > >MSComm控制元件過程中記憶體溢位和GetOneDimSize出錯的問題

MSComm控制元件過程中記憶體溢位和GetOneDimSize出錯的問題

MSComm控制元件過程中記憶體溢位和GetOneDimSize出錯的問題

現在做的一個專案需要實現上位機和微控制器的串列埠通訊,為了方便,使用了MSComm 件,但寫程式時在處理接收資料遇到了問題,程式可以編譯通過,但執行的過程中,程式只要接收到串列埠發來的資料,就會彈出記憶體溢位提示錯誤:in xx.exe(MFCO42D.DLL);0xC0000005,Acess Violation。處理接收資料部分程式如下:

void CDemoDlg::OnOnCommMscomm()   

{  

    // TODO: Add your control notification handler code here  

    VARIANT variant_inp;  

    //COleVariant myVar;  

    COleSafeArray safearray_inp;  

    long i=0;  

    long len;  

    char rxdata[200];  

    CString tmp;  

    switch (m_mscomm.GetCommEvent())  

    {  

        case 1:  

            break;        

        case 2:  

        //表示接收緩衝區內有字元  

            {  

                variant_inp=m_mscomm.GetInput();  

                safearray_inp=variant_inp;  

                len=safearray_inp.GetOneDimSize(); //問題出在這  

                for (i=0;i

                {  

                    safearray_inp.GetElement(&i,&rxdata[i]);  

                }  

                rxdata[i]='\0';  

            }  

            break;  

        default:  

            break;  

    }  

}  

經過除錯,確定問題出在len=safearray_inp.GetOneDimSize()這裡。在網上搜了一下,發現不少人在使用MSComm控制元件時遇到了跟我同樣的問題,有些人回覆說把使用的MFC動態連結庫改為靜態的,還有的說把variant_inp=m_mscomm.GetInput()改為variant_inp.Attch(m_mscomm.GetInput())。我照著這些方法都試了還是不行。後來在每週的例會上把這個問題跟一個同事說了一下,他幫我除錯了程式,發現variant=m_mscomm.GetInput()這局執行完後,variant裡依然是空的,並沒有獲得串列埠接收到的字串,這才造成了記憶體的洩露。上面的程式基本參照了網上成熟的MSComm控制元件使用的例子,按說程式碼不會出錯的,後來在CSDN的一篇帖子裡搜到可能是mfco42d.dll這個檔案的問題,遂到網上重新下載了個mfco42d.dll檔案替換原檔案。重新編譯,程式能執行,傳送和接收串列埠資料都正常。