求解Thunk!
typedef struct _MESSAGE_ENTRY
{
UINT uMsg;
void* pThis;
DWORD dwMemberFxnAddr;
BOOL bHandled;
}MESSAGE_ENTRY;
typedef struct _MSG
{
HWND hWnd;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
}MSG;
list<MESSAGE_ENTRY> m_MessageList;
list<MESSAGE_ENTRY>::iterator m_itrMap;
MSG m_CurrentMsg;
LRESULT WinProc::WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
for(m_itrMap = m_MessageList.begin(); m_itrMap != m_MessageList.end(); m_itrMap++)
{
if(((MESSAGE_ENTRY)(*m_itrMap)).uMsg == uMsg)
{
m_CurrentMsg.hWnd = hWnd;
m_CurrentMsg.uMsg = uMsg;
m_CurrentMsg.wParam = wParam;
m_CurrentMsg.lParam = lParam;
void* pThis = ((MESSAGE_ENTRY)(*m_itrMap)).pThis;
DWORD dwAddr = ((MESSAGE_ENTRY)(*m_itrMap)).dwMemberFxnAddr;
LRESULT lRes = 0;
BOOL bHandled = TRUE;
__asm
{
lea eax, dword ptr[bHandled];
push eax;
push lParam;
push wParam;
mov ecx, pThis;
call dwAddr;
mov dword ptr[lRes], eax;
}
if(bHandled)
return lRes;
else
continue;
}
}
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
template <class TFxn>
void MessageMap(UINT uMsg, void* pThis, TFxn MemberFxnName, BOOL bHandled = TRUE)
{
MESSAGE_ENTRY MessageEntry;
MessageEntry.uMsg = uMsg;
MessageEntry.pThis = pThis;
MessageEntry.dwMemberFxnAddr = Thunk::GetMemberFxnAddr(MemberFxnName);
MessageEntry.bHandled = bHandled;
m_MessageList.push_back(MessageEntry);
}
LRESULT WinProc::DefWindowProc()
{
_ASSERT(m_CurrentMsg.hWnd);
LRESULT lRes = ::DefWindowProc(m_CurrentMsg.hWnd, m_CurrentMsg.uMsg, m_CurrentMsg.wParam, m_CurrentMsg.lParam);
m_CurrentMsg.hWnd = NULL;
m_CurrentMsg.uMsg = NULL;
m_CurrentMsg.wParam = NULL;
m_CurrentMsg.lParam = NULL;
return lRes;
}
以上是一段关于Thunk技术封装窗口的代码,求教大家这段代码的详细解释以及变量的含义,thanks!