首先大家要明白什么是Thunk,为什么要用Thunk,通俗的来说Thunk就是将windows中一些回调函数转变成一种面向对象的技术。
VC中函数前有callback的就是其中一种,其中最有代表的函数 SetWindowLong 这个用来子类化窗体时要求一个回调函数如下
- LRESULT CALLBACK WindowProc(HWND hwnd,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam
- );
- SetWindowsHookEx 这是HOOK函数,不同类型的HOOK使用不同的回调函数,比如鼠标HOOK就用
- LRESULT CALLBACK MouseProc( int nCode,
- WPARAM wParam,
- LPARAM lParam
- );
如果直接使用 WindowProc MouseProc 将无法实现面向对象,因为这些函数是全局的
比如说,你有一个类subclass它的功能是子类化窗体,不同的窗体使用一个类对象,如 A,B,C窗体
你都要子类化,并对应一个子类化的类,如subclass a; subclass b; subclass c;
可是你会发现使用setwindowlong 子类化时,要的是WindowProc这个是全局的,按照
ubclass a; subclass b; subclass c; WindowProc函数共用,也就意味着你得在WindowProc特殊处理。
在这个时候Thunk就可以帮助你,使用Thunk后,WindowProc看起来就是私有的,这样你就不用特殊处理了
当然,也可以使用GetProp函数的方法来实现面向对象,因为这是窗体,正好可以使用GetProp这类函数来处理如下代码:
- LRESULT CALLBACK WindowProc(HWND hwnd,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam
- );
- 子类化窗体的回调函数还好处理些,可以将句柄与类的对应关系保存起来。或者使用::SetProp类似这种函数在窗体中设置一样标志,保存this指针,然后用
- ::GetProp取出来,类似下面这样的代码
- //设置回调
- void SubWindow::Test()
- {
- ::SetProp( hWnd, _T("AAA"), this);
- ::SetWindowLong( hWnd, GWL_WNDPROC, WindowProc);
- }
- LRESULT SubWindow::Window_Proc(.......)
- {
- }
- LRESULT CALLBACK WindowProc(HWND hwnd,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam
- )
- {
- SubWindow *pthis = ::GetProp( hwnd, _T("AAA"));
- if ( NULL != pthis )
- {
- pthis->Window_Proc(....);//这样就回到类里面去了
- }
- }
那么,其它的回调函数,要如何调呢???
那么为什么要修改任意参数的thunk呢??大家有没有发现,MouseProc第一个参数是int 在64位下是32位的,如果保存this指针,将会出错,
这个时候就得使用WPARAM wParam或LPARAM lParam来保存指针,因为这两个参数是指针变量,随着系统位数变化的.
现在来看看使用伪代码
- LRESULT CALLBACK MouseProc( int nCode,
- WPARAM wParam,
- LPARAM lParam
- )
- {
- subclass *p = (subclass*)wParam;//这里假设使用第二个参数传
- return p->MouseProc(...,...,...);//这样就使现了面向对象
- }
- subclass
- {
- public:
- void SetHook()
- {
- SetWindowsHookEx(...,..., MouseProc);
- }
- LRESULT MouseProc(int nCode,
- WPARAM wParam,
- LPARAM lParam)
- {
- //这里是处理代码,到这就实现了面向对象
- }
- }
原文与源码
http://www.panshy.com/article/Sort_Desktop/other/2014-04-09/2473.php
http://www.panshy.com/download/demo_code/fun_class_code/2014-04-09/231.php
http://www.panshy.com/download/demo_code/UI/2013-08-11/70.php
www.panshy.com/article/Sort_Desktop/other/2012-05-20/1689.php