вопрос об использовании регистра esp в ATL Windowing Thunking

Хорошо известно, что ATL подключает окно к своей wndproc с помощью thunking, который фактически заменяет hwnd этим указателем на месте и переходит к wndproc, так что вызов wndproc(hwnd, ...) на самом деле является wndproc(this, .. .) .

Ниже приведен ассемблерный код, который создает преобразователь:

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

У меня вопрос: поскольку этот преобразователь выполняется один раз, как мы можем быть уверены, что [esp+0x4] не будет перезаписан ЦП для вызова другой процедуры, и в следующий раз wndproc(...) вызвано, hwnd передан снова? Насколько я понимаю, [esp+0x4] — это многоразовый регистр общего назначения для хранения первого параметра любой процедуры.

Что здесь не так? как модификация hwnd гарантированно будет бессрочной?

Спасибо.


person t.g.    schedule 31.03.2011    source источник


Ответы (1)


я ошибался насчет

этот преобразователь выполняется только один раз

часть, она запускается каждый раз, когда приходит сообщение.

это связано с тем, что преобразователь сам , а не CWindowImplBaseT<>::WindowProc(), установлен как wndproc класса окна следующими строками CWindowImplBaseT<>::StartWindowProc в :

WNDPROC pProc = (WNDPROC)&(pThis->m_thunk.thunk);
::SetWindowLong(hWnd, GWL_WNDPROC, (LONG)pProc);
person t.g.    schedule 13.04.2011