将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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩不爱读书不做作业怎么办 母亲性格内向儿子也是内向怎么办 我儿子不爱吃怎么办啊 孩子练字就是记不住怎么办 孩子不愿意和小朋友玩怎么办 丈夫去世了婆婆不喜欢儿媳妇怎么办 高考看不下去书怎么办 在东莞读书读不成高中怎么办 嗓子哑了怎么办土方法 小孩舌头太长太大讲话不清楚怎么办 一周岁不喝奶粉怎么办 一岁的宝宝不吃奶粉怎么办 小孩不爱吃饭怎么办吃什么药 小孩这几天不爱吃饭怎么办 宝宝这几天不爱吃饭怎么办 想看书看不进去怎么办 宝宝3岁不爱看书怎么办 4岁宝宝不爱看书怎么办 1岁宝宝不爱看书怎么办 孩子一看书就哭怎么办 我不想读大专了怎么办 一年级的小孩不爱学习怎么办 高中的孩子不爱学习怎么办 9个月宝宝肠胃不好怎么办 孩子高烧过后干呕不爱吃饭怎么办 母乳涨奶发烧了怎么办 涨奶发烧了怎么办啊 2岁宝贝不吃饭怎么办 4个月的婴儿厌食怎么办 2个月婴儿厌食怎么办 3个月宝宝厌奶怎么办 没胃口吃不下饭怎么办 小孩吃多了积食怎么办 孩子吃撑了难受怎么办 卵巢早衰月经量少怎么办 7岁孩吃饭少消瘦怎么办 宝宝3岁不吃饭怎么办 小孩吃多了吐了怎么办 6岁儿童越来越瘦怎么办 7岁儿童不吃饭怎么办 天热宝宝不好好吃饭怎么办