ATL的thunk技术过一段时间不看就忘记他是怎么实现的,现在概括为几句话,方便记忆. CreateWindow时,第一个callback是在同一个堆栈里的,不是异步的.所以可以得到窗口对应的类的this指针.后续的callback则是异步的,得不到对应的窗口对象指针.怎么办呢,这时就用到thunk技术. thunk就是在数据段模拟了一个WNDPROC的结构,但中间做了手脚,用 this指针替换了WNDPROC的HWND参数.然后把这个WNDPROC设成callback的窗口过程. 顺便说一句,vc6时是在栈上模拟这个callback函数的,所以会有windows数据执行保护的问题,vc2003后则是在堆上模拟的,不会有这个问题. 想在 vc6上解决这个问题可以修改atl的源代码,把thunk这段内存置为可执行权限. |