所以我的问题是: 什么是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.
编辑:不能搬起石头砸自己的脚,你现在。
我猜其他语言有不同的技术作为消息的替代?
操作系统有几个消息选择。然而,并不是真正的便携式。
您还可以使用:
- 插座,
- (IMO太在这种情况下大吗?)准备好的消息系统(我最喜欢的0MQ)
如果DLL知道EXE要存储在句柄参数中的东西的类型,那么DLL甚至会使用*该类型的句柄参数,那么你已经错过了句柄点。提供句柄的模块应允许存储*任何*数据类型,而不用担心句柄的使用者以任何方式使用句柄,除非将句柄传回给句柄提供者。在你的例子中,EXE必须存储一个有效的TObject引用。如果没有,那么DoSomething会崩溃。也可以直接传递TObject而不是THandle charade。 – 2012-03-12 22:15:26
并传递TObject参考“提供与不同语言的兼容性”和可移植性?!?我只是展示了最简单的句柄实现,仅此而已。 – g2mk 2012-03-12 23:26:14
那么我的问题很简单。我不需要传递我只需要通知主应用程序一些更改的对象,因此我可以刷新GUI。我正在寻找跨平台的解决方案,可以与其他语言一起使用。我想我会用回调来完成它。我只需要一些批准和不同方面来解决我的问题。谢谢。 – Nix 2012-03-13 11:27:33