關於回調函數處理DLL裏的數據問題

        我想有過VC/MFC開發經驗的人都知道這個函數:WindowProc,系統調用消息的函數。所有由外部發給系統的消息,都要通過這個函數去處理判斷。大家都知道,就是系統調用的函數。就這一句簡單的話,很難說明是什麼意思?理解了嗎?會用了嗎?完全掌握了嗎?這些問題之前我很糊塗的回答:yes!因爲我學VC++,之前沒有接觸過自定義的回調函數。遇到問題,一頭霧水,完全不明白。最後終於明白是怎麼回事了。必須通過實踐,才能真正明白和理解。

    我寫的代碼是通過一個回調函數,把DLL裏的數據顯示在對話框窗口上。

    如果是C,就可以直接用 LRESULT CALLBACK XXX定義了,但如果是C++,你要定義在類裏面的話,一定要用static聲明,不然會出錯。我的實踐代碼如下:

    首先在對話框類裏面定義一個靜態回調函數:

       static void CALLBACK Chart_DisPaly(char* m_stockCode, char* m_orderPrice,     char* m_orderSide);

    實現這個回調函數,和其他函數基本沒有什麼區別,只是多了個CALLBACK,代碼如下:

 void CALLBACK CCallChartDemoDlg::Chart_DisPaly(char* Code, char*Price, char* Side)  //回調函數

{

  CString bufCode(m_stockCode);                                   //把char*型轉換成CString型便於處理
 CString bufPrice(m_orderPrice);
 CString bufSide(m_orderSide);
 CString tempBuf;
 CCallChartDemoDlg *pDemoDlg = NULL;/*new CCallChartDemoDlg;*/
 pDemoDlg = (CCallChartDemoDlg *)theApp.m_pMainWnd;             //這是最關鍵的一步,沒有了它,數據是傳遞不過去的,因爲找不到對話框窗體
 pDemoDlg->buffer = bufCode + "|" + bufPrice + "|" + bufSide;   //數據拿到啦
 tempBuf = pDemoDlg->buffer;
 pDemoDlg->m_Static.SetWindowText(tempBuf);//顯示回調過來的數據
 if (pDemoDlg->m_ListBox.GetCount() > 24 )
 {
  AfxMessageBox(_T("The item has overflowed range!"));
 }
 else
 {
  pDemoDlg->m_ListBox.AddString(tempBuf);//顯示回調過來的數據
 }
  

}

 

 

  接下來就是怎麼調用這個回調函數的問題了。要使用回調函數,就必須要用函數指針。我想學過C的人都知道是怎麼回事。這個東西其實就是函數在內存裏的存放地址,你先找到這個地址,然後在把函數的參數所帶的值傳遞進去處理。我調用的是DLL,所以看不到裏面函數的實現過程,只有一個約定好的接口,如下:
  typedef void (__stdcall *OnInputOrder)(char* Code, char* Price, char* Side);//聲 明函數指針

    OnInputOrder BacktoDLL = NULL;   //定義函數指針變量

    BacktoDLL = Chart_DisPaly;           // 把回調函數的地址給BacktoDLL,注意:回調函數不能帶參數
 myAPI.SetOrderEvent(BacktoDLL);     //再把地址傳過去。讓SetOrderEvent函數去處理。 這樣,通過DLL提供的接口SetOrderEvent函數,接收一個傳過去的回調函數的地址,讓SetOrderEvent函數內部去處理,就是要告訴DLL,你(DLL)處理的數據想要讓我(對話框類裏的的回調函數)幫你show或DisPlay,你必須先找到我給你的地方讓你show。說白了,就是這個道理。剛開始接觸函數指針,回調函數和DLL感覺好複雜,其實沒有想象的那麼複雜,明白了原理就再也簡單不過了。當然如果是DLL,  你首先要動態的把DLL加載進來纔是。加載方法也就是Load->Get->Free方式。注意了,只有把 DLL加載進來,才能找到SetOrderEvent函數的地址。通過地址找地址,然後處理數據,有點類似計算機組成原理上講的內存的間接訪問方式。如果你明白了這點。我想這個知識點說明你已經完全掌握了。

 

 總結 流程:先加載DLL-->找到接口函數的地址....(處理)...-->接口函數找到回調函數的地址-->回調函數把數據帶回去show.....

  

 

發佈了28 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章