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