关于回调函数处理DLL里的数据问题

时间:2020-12-21 18:52:42

        我想有过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.....

  

 

相关文章