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

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

	std::list list1;
	EnumThreadWindows(GetCurrentThreadId(),EnumThreadWndProc, (LPARAM)&list1);
	cout<<"window:"<

先看这种调用方式,如果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:好久没更新原创博客了,嘿嘿,今天来上这一篇,如果大家有什么意见或者上面有什么不对的地方欢迎大家指正!

你可能感兴趣的:(C++相关)