请教一个hook代码段中函数,并改变其中一个参数的问题
1个回答
2016-07-03
展开全部
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。回调函数还与Hook函数相类似,Hook函数只是回调函数的一个特例。习惯上把与SetWindowsHookEx函数一起使用的回调函数称为钩子函数。也有人把利用VirtualQueryEx安装的函数称为钩子函数,不过这种叫法不太流行。下面是一个动态库与应用程序之间,实现回调函数的例子,重在说明回调函数的实现机制,至于内部代码,根据自己程序需要来更改.步骤:1、在动态库中:1.1声明应用程序中回调函数的原形,例子如下:typedefint(WINAPI*PFCALLBACK)(intParam1,intParam2);2.2定义回调函数类型:PFCALLBACKgCallBack=0;3.3写被应用程序调用的接口函数:extern"C"voidWINAPITestCallBack(PFCALLBACKFunc){if(Func==NULL)return;gCallBack=Func;DWORDThreadID=0;HANDLEhThread=CreateThread(NULL,0,Thread1,LPVOID(0),0,&ThreadID);return;}4.4写Thread1这个过程:DWORDWINAPIThread1(LPVOIDlpParameter//threaddata){TCHARBuffer[256];HDChDC=GetDC(HWND_DESKTOP);intStep=1;MSGMsg;DWORDStartTick;//一个延时循环for(;Step<200;Step++){StartTick=GetTickCount();/*这一段为线程交出部分运行时间以让系统处理其他事务*/for(;GetTickCount()-StartTick<10;){if(PeekMessage(&Msg,NULL,0,0,PM_NOREMOVE)){TranslateMessage(&Msg);DispatchMessage(&Msg);}}/*把运行情况打印到桌面,这是vcbear调试程序时最喜欢干的事情*/sprintf(Buffer,"Running%04d",Step);if(hDC!=NULL)TextOut(hDC,30,50,Buffer,strlen(Buffer));}/*延时一段时间后调用回调函数*/(*gCallBack)(Step,1);/*结束*/::ReleaseDC(HWND_DESKTOP,hDC);return0;}2、在应用程序中:2.1在头文件中,声明回调函数原形,并定义应用程序实例句柄:typedefint(WINAPI*PFCALLBACK)(intParam1,intParam2);HINSTANCEm_handle;2.2在执行文件中加载动态库:m_handle=LoadLibrary("CallBack_Dll.dll");2.3在一个按钮事件中,调用动态库接口函数:voidCVC_CallBackDlg::OnCallBack(){//TODO:Addyourcontrolnotificationhandlercodeheretypedefvoid(WINAPI*PTestCallBack)(PFCALLBACK);PTestCallBackaddFun;//函数指针addFun=(PTestCallBack)GetProcAddress(m_handle,"TestCallBack");addFun(CBFunc);}2.4写回调函数过程:intWINAPICBFunc(intParam1,intParam2){intres=Param1+Param2;CHARBuffer[256]="";sprintf(Buffer,"callbackresult=%d",res);::MessageBox(NULL,Buffer,"Test",MB_OK);//演示回调函数被调用returnres;}2.5在窗口退出时,释放应用程序实例句柄:voidCVC_CallBackDlg::OnCancel(){//TODO:AddextracleanuphereFreeLibrary(m_handle);CDialog::OnCancel();}至此,动态库与应用程序的整个回调函数实现过程,就实现了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询