初学者的问题: 使用回调函数作参数的函数 与 回调函数 (30分)

  • 主题发起人 主题发起人 拾荒者
  • 开始时间 开始时间

拾荒者

Unregistered / Unconfirmed
GUEST, unregistred user!
(1)回调函数 原形是否只有一个结构而没有实际内容。
(2) API 中使用了回调函数 的函数不少,用起来也很方便,但这样的函数是怎样写的,大侠
们能提供一份示例代码吗?我想学写这样的函数,因为它真的很方便。
 
参照回调函数的原型,这时回调函数的类型相当于数据类型。
 
举个例子:

DLL中:
type
TCallBackFunc = procedure(x,y: integer);stdcall


var
CallBackFunc: TCallBackFunc


//赋值接口
procedure SetCallBackFunc(Func: TCallBackFunc);stdcall

begin
CallBackFunc := Func;
end;

DLL中调用:
if assigned(CallBackFunc) then CallBackFunc(CommonData.MousePos.x,CommonData.MousePos.y);
---------------------------
外部调用程序:

type
TCallBackFunc = procedure(x,y: integer);stdcall


procedure SetCallBackFunc(Func: TCallBackFunc);stdcall
external '../mousehook.dll';

procedure MyCallBack(x,y: integer);stdcall;
begin
Form1.Caption := format('%d:%d',[x,y]);
end;

//赋值
SetCallBackFunc(MyCallBack);
 
[:D]我也刚学回调函数,对于DLL中的回调函数,我的理解是,是客户端定义一个函数,而在DLL中定义一个该函数类型的变量,客户通过DLL的导出函数在调用DLL时,将客户端的实际定义的函数作为参数赋给DLL中的变量,DLL欲调用客户端的实际函数,只要检查DLL中的变量是否已赋值,如果已婚赋值则调用该变量即可。
至于COM中的回调函数,不知哪位高手请予以指点,谢谢!
 
原来zw84611已经作详细说明了,同意zw84611的!
 
TO zw84611:

:) 谢谢你,我想知道使用 回调函数作参数 的函数是怎样写的? 因为我也想学做这样的
函数,因为它真的很方便。
 
如我上例所示的:procedure SetCallBackFunc(Func: TCallBackFunc);
 
zw84611:

[:I]不好意思,刚才没看仔细,还以为是使用举例呢。 明白了,例子单简易懂,太感谢了。
 
[:I]不好意思,刚才没看仔细,还以为是使用举例呢。 明白了,例子单简易懂,太感谢了。
 
后退
顶部