Итак, мои вопросы: каковы альтернативы (кроссплатформенные) сообщениям 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 )