在此专做了一个类(CTempBoard),演示这个类以自已的成员函数作回调函数,并且几个实例同时存在。
如果你只是想用这种方法,那你只要保持原码中CTempBoard类的大体框架,然后你可以任一实现你的功能。
如果你想看懂那个类,建议先看看文章1,以便了解VC中this指钟的实现、虚函数定位。
对了,一定要记得使用这个方法的类,只能有一个虚函数:你的回调函数(当然你如果理解的话,你可以修改,其中文章2便作过解说)。
下面还是对CTempBoard讲解一下吧:
#define WM_VALUE_READY WM_USER+500 //自定义消息
typedef unsigned char ThunkData[9]; //存放自动生成代码的空间为9
class CTempBoard
{
public:
CTempBoard();
~CTempBoard();
void Start(HWND hWnd, UINT uElapse=1000); //启运这个类的自动功能
void Stop(); //停止这个类的自动功能
int m_Value;
private:
ThunkData m_ThunkData; //用来存放代码的数组
UINT m_Timer;
HWND m_hWnd;
virtual LRESULT TimerPro(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
//生成代码存放于m_ThunkData中
void inline ThunkInit();
};
CTempBoard::CTempBoard()
{
m_Value=0;
m_Timer=-1;
ThunkInit();
}
CTempBoard::~CTempBoard()
{
Stop();
}
void inline CTempBoard::ThunkInit()
{
m_ThunkData[0] = 0xB9; // mov ecx,
*((DWORD *)(m_ThunkData+1)) = (DWORD)this;
*((WORD *)(m_ThunkData+5)) = 0x018B; // mov eax, [ecx]
*((WORD *)(m_ThunkData+7)) = 0x20FF; // jmp [eax]
//通过这个函数,我们在m_ThunkData存入了如下代码:
//mov ecx, this;
//mov eax, [ecx];
//jmp[eax];
}
void CTempBoard::Start(HWND hWnd, UINT uElapse)
{
Stop();
m_hWnd=hWnd;
m_Timer=::SetTimer(0, 0, uElapse, (TIMERPROC)(void *)m_ThunkData);
//在此我们以m_ThunkData的地址为回调函数地址,
//所以当时间到时,它会跑到m_ThunkData的地址去执行,
//而在那里我们存入了this指针,然后才真正调到TimerPro,这样类成员函数便可以正常运行了
}
void CTempBoard::Stop()
{
::KillTimer(0, m_Timer);
}
LRESULT CTempBoard::TimerPro(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
//成员函数,可以存取成员变量,也可调用成员函数。
this->m_Value=::rand()%101;
::SendMessage(m_hWnd, WM_VALUE_READY, m_Value, (long)this);
return 0;
}
OllyDbg的help-分析模块介绍 | 视窗XP Pro/2003 Enterprise Server算号器 |
类以自已的成员函数作回调函数,并且几个实例同时存在。 | |
[ 发布日期:21年前 (2004-08-07) ] [ 来自:Original ] | [分类:C\C++相关] |
[ 分类:C\C++相关
| 查看:716 ]
暂时没有评论,快来发表一个评论吧。
发表评论 |