闂傚倷娴囬妴鈧柛瀣崌閺岀喖顢涘⿰鍐炬毉濡炪們鍎婚幏锟� (0) +1 闂備浇宕垫慨宥咁吋閸℃浼� (0) +1 闂傚倸鍊搁オ瀛樼閻戣棄绠柨鐕傛嫹 (0) +1
闂傚倷娴囬妴鈧柛瀣崌閺岀喖顢涘⿰鍐炬毉濡炪們鍎查崹鍧楀蓟閻旇 鍋撳☉娅亝鎱ㄩ崶褉鏀芥い鏇炴鐎氾拷闂傚倷绀侀幖顐ゆ偖椤愶箑纾块柛鎰嚋閼板潡鏌涘☉娆愮稇缂備讲鏅犻弻鐔碱敍濠婂喚鏆銈冨劵閹凤拷>>

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

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


  #pragma pack(push,1) //该结构必须以字节对齐
  struct Thunk {
  BYTE    Call;
  int    Offset;
  WNDPROC   Proc;
  BYTE    Code[5];
  CMyWnd*   Window;
  BYTE    Jmp;
  BYTE    ECX;
  };
  #pragma pack(pop)

  类定义:


  class CMyWnd
  {
  public:
  BOOL Create(...);
  LRESULT WINAPI WindowProc(UINT,WPARAM,LPARAM);
  static LRESULT WINAPI InitProc(HWND,UINT,WPARAM,LPARAM);
  static LRESULT WINAPI stdProc(HWND,UINT,WPARAM,LPARAM);
  WNDPROC CreateThunk();
  WNDPROC GetThunk(){return m_thunk}
  ...

  private:
  WNDPROC m_thunk
  }

  在创建窗口的时候把窗口过程设定为this->m_thunk,m_thunk的类型是WNDPROC,因此是完全合法的,当然这个m_thunk还没有初始化,在创建窗口前必须初始化:


  WNDPROC CMyWnd::CreateThunk()
  {
  Thunk*  thunk = new Thunk;
  
  ///////////////////////////////////////////////
  //
  //系统调用m_thunk时的堆栈:
  //ret HWND MSG WPARAM LPARAM
  //-------------------------------------------
  //栈顶                                             栈底
  ///////////////////////////////////////////////

  //call Offset
  //调用code[0],call执行时会把下一条指令压栈,即把Proc压栈
  thunk->Call = 0xE8;        // call [rel]32
  thunk->Offset = (size_t)&(((Thunk*)0)->Code)-(size_t)&(((Thunk*)0)->Proc);  // 偏移量,跳过Proc到Code[0]
  thunk->Proc = CMyWnd::stdProc;  //静态窗口过程

察看评论详细内容 我要发表评论
作者笔名 简短内容 发表时间
:

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品
闂傚倷绀佺紞濠傖缚瑜旈、鏍幢濡炵粯鏁犻梺閫炲苯澧撮柟顔款潐閹峰懘宕ㄦ繝鍌欐樊婵犵妲呴崑鎾诲箯閿燂拷闂傚倷鐒﹂幃鍫曞磿閹惰棄纾绘繛鎴欏灩閺勩儵鎮橀悙鏉垮珟濞存粍绮撻弻娑㈩敃閿濆棛顦ラ梺鍛婃閹凤拷