众所周知,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的修改是永久性的?
感谢。
答案 0 :(得分:0)
我错了
这个thunk只执行一次
部分,它实际上在每次消息到达时运行。
这是因为thunk 本身,而不是CWindowImplBaseT<>::WindowProc()
,被以下行CWindowImplBaseT<>::StartWindowProc
设置为窗口类的wndproc:
WNDPROC pProc = (WNDPROC)&(pThis->m_thunk.thunk);
::SetWindowLong(hWnd, GWL_WNDPROC, (LONG)pProc);