1

众所周知,ATL 通过 thunking 将一个窗口挂接到它的 wndproc,它实际上用 this 指针替换 hwnd 并跳转到 wndproc,因此对 wndproc(hwnd, ...) 的调用实际上是 wndproc(this, .. .) .

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

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

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

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

谢谢。

4

1 回答 1

0

我错了

这个 thunk 只执行一次

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

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

WNDPROC pProc = (WNDPROC)&(pThis->m_thunk.thunk);
::SetWindowLong(hWnd, GWL_WNDPROC, (LONG)pProc);
于 2011-04-13T03:36:10.887 回答