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の変更が永続的であることがどのように保証されていますか?
ありがとう。