正在阅读:MFC:thunk技术实现窗口类的封装MFC:thunk技术实现窗口类的封装

2004-09-29 14:40 出处:CSDN 作者:ringphone 责任编辑:huangpeidan


  this            //初始化参数
  );,

  在InitProc里面取出该指针:

  LRESULT WINAPI CMyWnd::InitProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam)
  {  
  if(uMsg == WM_NCCREATE)
  {
  CMyWnd *w = NULL;
  w = (CMyWnd*)((LPCREATESTRUCT)lParam)->lpCreateParams;
  if(w)
  {
  //记录hWnd
  w->m_hWnd = hWnd;
  
  //改变窗口过程为m_thunk
  SetWindowLong(hWnd,GWL_WNDPROC,(LONG)w-CreateThunk());
  return (*(WNDPROC)(w->GetThunk()))(hWnd,uMsg,wParam,lParam);  
  }
  }
  return DefWindowProc(hWnd,uMsg,wParam,lParam);
  }

  这样就大功告成。

  窗口过程转发流程:

  假设已建立CMyWnd类的窗口对象 CMyWnd *window,初始化完毕后调用window->Create,这时Create的窗口其窗口过程函数是静态CMyWnd::InitWndProc

  题外话:thunk的汇编代码全部写在注释里了,把这段汇编转成数据可费了不少劲,当时手头没有合适的工具,只有一本《8086/8088汇编语言程序设计》,根据附录中的指令码汇总表转成机器码数据,那里面根本没有EAX,ECX,ESP等的概念,只能连蒙带猜加调试,非法操作了n(n>10)回才得到那些数据,当时真是长出了一口气:TNND,终于搞定了!:-)

 

察看评论详细内容 我要发表评论
作者笔名 简短内容 发表时间
:
键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品