私の質問は次のとおりです。 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.
編集:あなたはあなたの足で自分自身を撮影することはできません今。
他の言語はメッセージの代わりに異なる技術を持っていると思いますか?
OSにはいくつかのメッセージがあります。しかし、多くの本当に移植可能です。
また、使用することができます。この場合は
(IMO大きすぎる
- ソケットを、?)準備ができているメッセージングシステム(私のお気に入り0MQ)
DLLがEXEがhandleパラメータに格納するオブジェクトの型を知っていて、ハンドルパラメータがそのタイプである場合、ハンドルのポイントを見落としてしまいました。ハンドルを提供するモジュールは、ハンドルプロバイダーにそれを戻す以外は何らかの方法でそれを使用するハンドルのコンシューマーの恐れなしに、*任意の*データ型をその中に格納することが許されるべきです。あなたの例では、EXEは有効なTObject参照を格納しなければなりません。そうでなければ、DoSomethingがクラッシュします。このTHandleの代わりにTObjectを直接渡すこともできます。 –
そして、TObjectリファレンス "異なる言語との互換性を提供する"と移植性を渡しますか?私は、可能な限りシンプルなハンドル実装を示しました。 – g2mk
私の問題は非常に簡単です。オブジェクトを渡す必要はありません。メインアプリケーションに変更を通知する必要があるため、GUIをリフレッシュできます。私はクロスプラットフォームであり、他の言語でも使用できるソリューションを探しています。私はコールバックでそれをやると思います。私はちょうどいくつかの承認と私の問題のさまざまな側面が必要でした。ありがとう。 – Nix