关于esp在ATL窗口Thunking中注册用法的问题

时间:2011-03-31 03:29:13

标签: atl thunk windowing

众所周知,ATL通过thunking将窗口挂钩到它的wndproc,实际上用这个指针替换hwnd并跳转到wndproc,以便调用wndproc(hwnd,...)实际上是wndproc(这个,...)。

下面是thunk构造的汇编代码:

mov dword ptr [esp+0x4], pThis (esp+0x4 is hWnd)

我的问题是,因为这个thunk只执行一次,我们如何确保[esp + 0x4]不会被CPU覆盖以调用另一个程序,并且下次wndproc(.. 。)被称为,hwnd再次传入?我的理解是[esp + 0x4]是一个可重用的通用寄存器,用于存储任何过程的第一个参数。

这里有什么问题?如何保证hwnd的修改是永久性的?

感谢。

1 个答案:

答案 0 :(得分:0)

我错了

  

这个thunk只执行一次

部分,它实际上在每次消息到达时运行。

这是因为thunk 本身,而不是CWindowImplBaseT<>::WindowProc(),被以下行CWindowImplBaseT<>::StartWindowProc设置为窗口类的wndproc:

WNDPROC pProc = (WNDPROC)&(pThis->m_thunk.thunk);
::SetWindowLong(hWnd, GWL_WNDPROC, (LONG)pProc);