如何让类的成员函数作为回调函数

BOOL CALLBACK EnumThreadWndProc(HWND hwnd, LPARAM lParam )
{   
	std::list<HWND>* plist = (std::list<HWND>*)lParam;
	plist->push_back(hwnd);
	return true;
}

	std::list<HWND> list1;
	EnumThreadWindows(GetCurrentThreadId(),EnumThreadWndProc, (LPARAM)&list1);
	cout<<"window:"<<list1.size()<<endl;

先看这种调用方式,如果EnumThreadWnProc是放在类内的,那么会遇到类似的错误:

error C3867: 'CVGAppPlugin::EnumThreadWndProc': function call missing argument list; use '&CVGAppPlugin::EnumThreadWndProc' to create a pointer to member

如果不在类内定义,则使用起来没有任何问题,为什么会这样呢?

出现这种问题时,我们可以这么做大笑

    1. 类成员函数不能作为回调函数的主要原因在于类成员函数使用__thiscal参数传递方式,因此需要调用者(caller)通过ecx寄存器提供类对象的指针。而回调函数使用__stdcall参数传递方式,不具备这个特点。

    所以想办法在类成员函数被调用之前设置好ecx寄存器,就能在__stdcall调用的基础上模拟出一个完好的__thiscall调用。

    2. 使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作为回调函数了。

    3. 不使用成员函数,直接使用普通C函数,为了实现在C函数中可以访问类的成员变量,可以使用友元操作符(friend),在C++中将该C函数说明为类的友元即可。这种
处理机制与普通的C编程中使用回调函数一样。


PS:好久没更新原创博客了,嘿嘿,今天来上这一篇,如果大家有什么意见或者上面有什么不对的地方欢迎大家指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值