求解Thunk!

kim_jinye 2010-05-21 01:34:11
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!
...全文
92 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
redleaves 2010-05-22
  • 打赏
  • 举报
回复
好钢没用到刀刃上...
thunk本身是利用动态生成的可执行代码来包装一个对象的成员,把调用直接转发给一个确定的对象的成员.
从而把一个对象的成员调用包装成一个全局的函数调用.

在消息处理的时候,可以用thunk来做消息转发,把win32用的消息处理函数转发给消息对应的窗口对象.

而楼主给的程序中,是用thunk来做消息的dispatch.把具体消息的处理函数和消息关联起来.事实上.这里根本用不着thunk.直接用函数对象就可以解决了.更加直接高效.
楼主这个程序用list+foreach这种形式转发消息,实在是一种性能最最低下的实现. 用个map都比这强得多...
而且事实上.用switch case在通常情况下是最高性能的实现.另外如果可以不考虑内存占用,跳转表当然可能会更好些.
Proteas 2010-05-22
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/cpp/Thunk_uses.aspx
kim_jinye 2010-05-22
  • 打赏
  • 举报
回复
自己顶下!
kim_jinye 2010-05-22
  • 打赏
  • 举报
回复
自己再再顶下!
kim_jinye 2010-05-22
  • 打赏
  • 举报
回复
自己再顶下!
stjay 2010-05-21
  • 打赏
  • 举报
回复
晕,还用List,用的着这么麻烦么...
倒不如用map将HWND和this映射起来算了
看看ATL的Thunk是如何实现的吧
Paradin 2010-05-21
  • 打赏
  • 举报
回复
mark!

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧