频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

使用回调函数(VC & Delphi)

来源: 作者: 出处:巧巧读书 2007-10-09 进入讨论组
下一页 1 2 3 

  回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。

本文不准备介绍这些函数和过程,而是谈谈实现自己的回调函数的一些经验。

  之所以产生使用回调函数这个想法,是因为现在使用VC和Delphi混合编程,用VC写的一个DLL程序进行一些时间比较长的异步工作,工作完成之后,需要通知使用DLL的应用程序:某些事件已经完成,请处理事件的后续部分。开始想过使用同步对象,文件影射,消息等实现DLL函数到应用程序的通知,后来突然想到可不可以在应用程序端先写一个函数,等需要处理后续事宜的时候,在DLL里直接调用这个函数即可。于是就动手,写了个回调函数的原形。在VC和Delphi里都进行了测试。

  一:声明回调函数类型。

  vc版typedef int (WINAPI*PFCALLBACK)(intParam1,intParam2);

  Delph版 PFCALLBACK=function(Param1:integer;Param2:integer):integer;stdcall;

  实际上是声明了一个返回值为int,传入参数为两个int的指向函数的指针。由于C++和PASCAL编译器对参数入栈和函数返回的处理有可能不一致,把函数类型用WINAPI(WINAPI宏展开就是__stdcall)或stdcall统一修饰。

  二:声明回调函数原形

  声明函数原形

  vc版 int WINAPICBFunc(intParam1,intParam2);

  Delphi版 function CBFunc(Param1,Param2:integer):integer;stdcall;

  以上函数为全局函数,如果要使用一个类里的函数作为回调函数原形,把该类函数声明为静态函数即可。

  三:回调函数调用调用者

  调用回调函数的函数我把它放到了DLL里,这是一个很简单的VC生成的WIN32DLL.并使用DEF文件输出其函数名TestCallBack。实现如下:

   PFCALLBACK gCallBack=0;
  void WINAPI TestCallBack(PFCALLBACKFunc)
  {
   if(Func==NULL) return;
   gCallBack=Func;
   DWORDThreadID=0;
   HANDLEhThread=CreateThread(NULL,NULL,Thread1,LPVOID(0),ThreadID);
   return;
  }

  此函数的工作把传入的PFCALLBACKFunc参数保存起来等待使用,并且启动一个线程。声明了一个函数指针PFCALLBACKgCallBack保存传入的函数地址。

浏览URL http://www.qqread.com/delphi/u351980.html进入讨论组讨论。
下一页 1 2 3 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章