将C++builder中的类成员函数当作windows回调函数
来源:互联网 发布:php 日期格式转时间戳 编辑:程序博客网 时间:2024/06/05 11:31
VCL的成员函数通常情况下,不能作为winodws的回函数,因为成员函数隐式包含一个this指针参数。回调函数中,最先运行机器码(windows自动执行)。
//16个字节汇编指令#pragma pack(push) //保存对齐状态#pragma pack(1)struct TInstruction{ byte Code1[7]; void *Self; byte Code2; void *Method;};#pragma pack(pop) //恢复对齐状态typedef TInstruction * PInstruction ;//改造回调函数PInstruction MakeInstruction(TMethod &Method){ //机器码使参数符合回调要求,然后又使之复合成员函数的调用要求 byte Code[16] ={0xFF,0x34,0x24,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0xE9,0x00,0x00,0x00,0x00}; PInstruction P; P = (PInstruction)malloc(sizeof(struct TInstruction)); memmove(P,Code, 16); P->Self = Method.Data; P->Method = (void *)((long)(Method.Code)-(long(P)+sizeof(Code))); return P;}//类销毁时使用void FreeInstruction(void *P){ free(P);}//---------------------------------------------------------------------------//定时器回调函数TIMERPROC __stdcall TForm1::TimerProc( HWND hwnd, // handle to window UINT uMsg, // WM_TIMER message UINT_PTR idEvent, // timer identifier DWORD dwTime // current system time){ this->Caption = Now(); KillTimer(hwnd,0);}void __fastcall TForm1::Button3Click(TObject *Sender){ TMethod M; ShortString ProcName = "TimerProc"; M.Code = MethodAddress(ProcName); M.Data = this; P1 = MakeInstruction(M);//P1是在TForm1中定义的成员变量void * P1 SetTimer(this->Handle,0,1000,(TIMERPROC)(P1));//定时器函数}
0 0
- 将C++builder中的类成员函数当作windows回调函数
- 将类成员函数用做C回调函数
- 将类成员函数用作C回调函数
- 将类成员函数用做C回调函数
- 将类成员函数用做C回调函数
- 将类成员函数用做C回调函数
- 将类成员函数用做C回调函数
- 将类成员函数用做C回调函数
- 将类成员函数用做C回调函数
- 将成员函数作为回调函数
- QT4编程之 - 将类成员函数用做C回调函数
- 如何将类成员函数作成一个回调函数
- 如何将类成员函数作成一个回调函数
- 将类的成员函数注册为回调函数
- C++将类的成员函数作为回调函数
- C++将类的成员函数作为回调函数
- opengl 回调函数调用类中的成员函数
- 类成员函数作为回调函数
- 期望求解
- JavaScript中实现键值对的方法
- DBCP的配置参数
- hadoop eclipse 程序调试
- 二维数组查找算法
- 将C++builder中的类成员函数当作windows回调函数
- sybase字段属性,identity,设置跳跃值,手工插入自增初始值
- 运算符%
- 19~20日学习总结
- mysql字段值自动更新时间
- ASP.NET 控件不用Disabled实现ReadOnly的效果,即字体不变灰色。
- win7 优化处理
- SVN版本冲突文件说明 和 解决办法
- FontAwesome-用TextView显示图片