1

ATL がサンクによってウィンドウをその wndproc にフックすることはよく知られています。これは、実際に hwnd をこのポインターに置き換えて、wndproc にジャンプし、wndproc(hwnd, ...) への呼び出しが実際には wndproc(this, .. .) .

以下は、サンクが構築するアセンブリ コードです。

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

私の質問は、このサンクは1 回しか実行されないため、[esp+0x4] が別のプロシージャを呼び出すために CPU によって上書きされないことをどのように確認できますか。次に wndproc(...) が呼び出されると、hwnd が再び渡されます。 ? 私の理解では、 [esp+0x4] は、任意のプロシージャの最初のパラメーターを格納するための再利用可能な汎用レジスタです。

ここで何が間違っていますか?hwndの変更が永続的であることがどのように保証されていますか?

ありがとう。

4

1 に答える 1

0

私は間違っていた

このサンクは 1 回だけ実行されます

一部、メッセージが到着するたびに実際に実行されます。

これは、 ではなくサンク自体CWindowImplBaseT<>::WindowProc()が、 の次の行によってウィンドウ クラスの wndproc に設定されているためですCWindowImplBaseT<>::StartWindowProc

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