所以我的問題是: 什麼是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