WEB开发网
开发学院软件开发VC 使用回调函数(VC & Delphi) 阅读

使用回调函数(VC & Delphi)

 2010-01-23 20:32:36 来源:WEB开发网   
核心提示:回调函数是一个很有用,也很重要的概念,使用回调函数(VC & Delphi),当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数,实现如下:PFCALLBACKgCallBack=0; void WINAPI TestCallBack(PFCALLBACKFunc) { if(Func==NULL)

回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在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保存传入的函数地址。

1 2 3  下一页

Tags:使用 回调 函数

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接