2011-03-31 1 views
1

Il est bien connu que ATL accroche une fenêtre à son wndproc par thunking, qui remplace réellement hwnd avec ce pointeur en place et et saute au wndproc de sorte qu'un appel à wndproc (hwnd, ...) est en fait wndproc (ceci, ...).question sur esp Utilisation du registre dans ATL Windowing Thunking

est Ci-dessous le code assembleur les constructions thunk:

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

Ma question est, puisque ce thunk EXÉCUTE ne fois, comment pouvons-nous être sûrs que [esp + 0x4] ne sera pas écrasé par CPU pour appeler une autre procédure, et la prochaine fois que wndproc (...) est appelée, hwnd est de nouveau passé? Ma compréhension est que [esp + 0x4] est un registre polyvalent réutilisable pour stocker un premier paramètre de n'importe quelle procédure.

Qu'est-ce qui ne va pas ici? comment la modification de hwnd est-elle garantie pour être perpétuelle?

Merci.

Répondre

0

Je me suis trompé sur le

cette thunk n'exécute une fois

partie, il fonctionne en fait à chaque fois qu'un message arrive.

En effet, le thunk se, non CWindowImplBaseT<>::WindowProc(), est définie comme la wndproc de la classe de fenêtre par les lignes suivantes dans CWindowImplBaseT<>::StartWindowProc:

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