вопрос об использовании esp Register в ATL Windowing Thunking - PullRequest
1 голос
/ 31 марта 2011

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

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

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

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

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

Спасибо.

1 Ответ

0 голосов
/ 13 апреля 2011

Я был неправ насчет

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

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

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

WNDPROC pProc = (WNDPROC)&(pThis->m_thunk.thunk);
::SetWindowLong(hWnd, GWL_WNDPROC, (LONG)pProc);
...