delphi – 通知从dll到主应用程序的事件
我正在开发打算跨平台的应用程序.我以前使用
Windows消息,但现在我正在删除它.我用回调替换了消息,但无论我是否可以使用不同的技术,我都不知道不使用Windows消息时的不同可能性.
好吧,我有主要的exe应用程序和一些DLL插件.我在dll中有一些对象和线程,我想通知主应用程序有关DLL对数据结构所做的一些更改. 正如我所说,我目前正在处理一些回调.为了提供与不同语言(C,VB,C#)的兼容性,我有非对象类型的回调.我不确定其他语言是否支持对象的回调. 所以我的问题是: > Windows消息的替代方案(跨平台)有哪些?回调可以取代消息吗? 解决方法
是的,您可以使用回调替换消息.
您不应该使用对象方法作为回调.可移植代码中的常见做法是使用句柄(通知调用约定): DLL源码: type THandle = LongWord; {$IF SizeOf(THandle) < SizeOf(Pointer))} {$MESSAGE Error 'Invallid handle type'} {$ENDIF} TCallback = procedure(const aHandle: THandle); cdecl; var gCallback: record Routine: TCallback; Obj: TObject; Info: string end; function Object2Handle(const aObj: TObject): THandle; begin Result:= THandle(Pointer(aObj)) end; function Handle2Object(const aHandle: THandle; out aObj: TObject): Boolean; begin if gCallback.Obj <> nil then if aHandle = Object2Handle(gCallback.Obj) then begin aObj:= gCallback.Obj; Result:= true; Exit // WARRNING: program flow disorder end; aObj:= nil; Result:= false end; procedure DoCallback(); begin if Assigned(gCallback.Routine) then gCallback.Routine(Object2Handle(gCallback.Obj)) end; procedure SetupCallback(const aCallback: TCallback); cdecl; begin gCallback.Routine:= aCallback; end; procedure DoSomething(const aHandle: THandle; out aInfo: string); cdecl; var O: TObject; begin if Handle2Object(aHandle,O) then aInfo:= Format('%s class object %s',[O.ClassName(),gCallback.Info]) end; procedure Test(); begin gCallback.Obj:= TStream.Create(); try gCallback.Info:= 'created'; DoCallback(); finally FreeAndNil(gCallback.Obj) end; gCallback.Obj:= TMemoryStream.Create(); try gCallback.Info:= 'will be freed'; DoCallback(); finally FreeAndNil(gCallback.Obj) end end; exports SetupCallback,DoSomething,Test; 可执行来源: procedure Cb(const aHandle: THandle); cdecl; const STUPID: THandle = 1; EQUALLY_STUPID = $DEAD; var S: string; begin DoSomething(STUPID,S); DoSomething(aHandle,S); DoSomething(EQUALLY_STUPID,S) end; begin SetupCallback(@Cb); Test() end. 编辑:你现在不能射击自己.
操作系统有一些消息选择.然而,并不是很多真正便携 您还可以使用: >插座, (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |