用类的成员函数作为窗口回调函数

//头文件(TestClass.h)

#ifndef  CTESTCLASS_H_H_H_H

#define CTESTCLASS_H_H_H_H

#include <windows.h>

 

class CTestClass //虚函数没列出来,但这个类有虚函数,否则代码会有变动
{
public:
    int WINAPI Create();
    CTestClass();

 

private:
    LRESULT CALLBACK MainFunc(UINT uMsg,WPARAM wParam,LPARAM lParam);
 
public:
    HWND    m_hWnd; //如果窗口句柄不是第一个数据成员,代码会有变动
    ....

};

#endif

 

 

//源文件(TestClass.cpp)

#include "TestClass.h"

...

typedef LRESULT (CALLBACK CTestClass::*FUNCADDR)(UINT,WPARAM,LPARAM);

int WINAPI CTestClass::Create()
{
 m_pCode=new BYTE[25]; //构造一个用机器骂直接写的函数让系统回调,
 m_pCode[0]=0x50;          //然后传递this指针并跳到成员函数中
 m_pCode[1]=0x51;

 m_pCode[2]=0xB9;

 DWORD This=(DWORD)this;
 memcpy(&m_pCode[3],&This,4);

 BYTE Code[13]={0x8B,0x44,0x24,0xC,0x89,0x41,0x4,0x89,0x4C,0x24,0xC,0x59,0x58};
 memcpy(&m_pCode[7],&Code,13);

 m_pCode[20]=0xE9;

 FUNCADDR FuncAddr=&CGameFrame::MainFunc;
 DWORD    dwFuncAddr;
 _asm
 {
  push eax
  mov  eax,FuncAddr
  mov  dwFuncAddr,eax
  pop  eax
 }
 dwFuncAddr=dwFuncAddr-(DWORD)m_pCode-20-5;
 memcpy(&m_pCode[21],&dwFuncAddr,4);

 m_wc.lpfnWndProc=(WNDPROC)m_pCode;
 ::RegisterClass(&m_wc);

.......

}

LRESULT CALLBACK CTestClass::MainFunc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    return ::DefWindowProc(this->m_hWnd,uMsg,wParam,lParam);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值