我的程序中需要在回调函数中使用类的成员函数,但是我看了好多人的帖子都说回调函数必须是全局的或是类的静态函数,这样以来我在这个回调函数中使用类的其他成员函数就不行了。请问我该如何处理这个问题啊?请说明清楚一点,最好是有一段示例代码。谢谢!
下面是我的程序的部分示例代码:
class DDN
{
public:
bool sen(char a);
}
void callback(char b) //callback是一个回调函数
{
……
DDN* p
p->sen(b); // 这句在运行时会出错
……
}
另:我的回调函数不是被系统调用的,而是被我自己写的动态连接库调用的。
是你自己写的动态连接库调用就好办了,把对象指针传给回调函数就行了,修改一下callback:
void callback(DDN* p,char b) //callback是一个回调函数
{
……
if(p != NULL)
p->sen(b);
……
}
如果是系统调用,比如自己封装的窗口类,窗口过程必须是全局或静态成员函数,这时你怎么得到对象指针呢?
回调函数作为类的静态成员函数定义。传入类的指针。
比如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);
to wangbab(bab)
为什么int CALLBACK CMyListCtrl::CompareFunc(LPARAM lParam1,LPARAM lParam2,
LPARAM lParam3)
有3个参数
而传进去只有一个lParam3
那么LPARAM lParam1,LPARAM lParam2 可以不要?
定义一个全局指针
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);//如此调用即可
……
}
p放入参数或者全局变量中,总之保持唯一