当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

 ·我为什么没有组策略呢    »显示摘要«
    摘要: 我用的是联想的xp home为什么在运行中打gpedit.msc就没有组策略窗口呢? ......
 ·自动关机的问题    »显示摘要«
    摘要: 用exitwindowsex()函数为什么在98下好用,2000下不好用呢? ......


如何在回调函数中调用某个类的成员函数

我的程序中需要在回调函数中使用类的成员函数,但是我看了好多人的帖子都说回调函数必须是全局的或是类的静态函数,这样以来我在这个回调函数中使用类的其他成员函数就不行了。请问我该如何处理这个问题啊?请说明清楚一点,最好是有一段示例代码。谢谢!  
  下面是我的程序的部分示例代码:  
   
  class   DDN  
  {  
  public:  
      bool   sen(char   a);  
  }  
   
  void   callback(char   b)     //callback是一个回调函数  
  {  
      ……  
      DDN*   p  
      p->sen(b);     //   这句在运行时会出错  
      ……  
  }  
   
  另:我的回调函数不是被系统调用的,而是被我自己写的动态连接库调用的。

NO.1   作者: ringphone

是你自己写的动态连接库调用就好办了,把对象指针传给回调函数就行了,修改一下callback:  
   
  void   callback(DDN*   p,char   b)     //callback是一个回调函数  
  {  
      ……  
      if(p   !=   NULL)  
      p->sen(b);      
      ……  
  }  
   
  如果是系统调用,比如自己封装的窗口类,窗口过程必须是全局或静态成员函数,这时你怎么得到对象指针呢?

NO.2   作者: wangbab

回调函数作为类的静态成员函数定义。传入类的指针。  
  比如CListCtrl的排序函数  
  BOOL   SortItems(  
        PFNLVCOMPARE   pfnCompare,  
        DWORD_PTR   dwData    
  );  
   
  这里pfnCompare就是自己定义的一个回调函数。定义如下:  
  //lParam3为传入的参数this    
  int   CALLBACK   CMyListCtrl::CompareFunc(LPARAM   lParam1,LPARAM   lParam2,  
                                                                            LPARAM   lParam3)  
  {  
            CMyListCtrl   *pList=(CMyListCtrl*)lParam3;  
            //以后就可以用pList访问CMyListCtrl中的成员  
  }  
  //调用如下  
  SortItems(CompareFunc,this);

NO.3   作者: ljp940531

to   wangbab(bab)  
  为什么int   CALLBACK   CMyListCtrl::CompareFunc(LPARAM   lParam1,LPARAM   lParam2,  
                                                                            LPARAM   lParam3)  
  有3个参数  
  而传进去只有一个lParam3  
  那么LPARAM   lParam1,LPARAM   lParam2   可以不要?

NO.4   作者: w_yufeng

定义一个全局指针  
  DDN   *g_pDDN;  
  然后再在ddn的构造函数中如此写即可:  
  DDN::DDN()  
  {  
            g_pDDN   =   this;  
  }  
   
  class   DDN  
  {  
  public:  
      bool   sen(char   a);  
  }  
   
  void   callback(char   b)     //callback是一个回调函数  
  {  
      ……  
  //     DDN*   p  
  //     p->sen(b);     //   这句在运行时会出错  
  g_pDDN->sen(b);//如此调用即可  
      ……  
  }  
 

NO.5   作者: bluebohe

p放入参数或者全局变量中,总之保持唯一


 ·xp为什么删除文件后这样呢    »显示摘要«
    摘要: xp为什么在控制面板中删除文件后删除文件的窗口关不上呢? ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE