2

スーパー オブジェクトを使用してクラス内でプロシージャを呼び出そうとしていますが、うまくいきません。

コードサンプル:

program test_rpc;

{$IFDEF FPC}
  {$MODE OBJFPC}{$H+}
{$ELSE}
  {$APPTYPE CONSOLE}
{$ENDIF}

uses
  SysUtils, superobject;

type
  TCC = class(TObject)
  published
    procedure controler_method1(const This, Params: ISuperObject; var Result: ISuperObject);
  end;

procedure TCC.controler_method1(const This, Params: ISuperObject; var Result: ISuperObject);
var
  i: Integer;
begin
  write('action called with params ');
  writeln(Params.AsString);
end;

var
  s: ISuperObject;
  CC: TCC;
begin
  CC := TCC.Create;
  s := TSuperObject.Create;
  s.M['controler.action1'] := CC.MethodAddress('controler_method1');
  try
    s['controler.action1("HHAHAH")'];
  finally
    s := nil;
    writeln('Press enter ...');
    readln;
  end;
end.

それはクラッシュします、ここで何が間違っていますか?

実際には「Paramsで呼び出されたアクション」になりますが、paramを表示できません...

4

1 に答える 1

2

スーパー メソッドには、次のような署名があります。

TSuperMethod = procedure(const This, Params: ISuperObject;
    var Result: ISuperObject);

これは、インスタンス メソッドの署名に互換性がないため、インスタンス メソッドを使用できないことを意味します。メソッドは次のようになります。

procedure sm(const This, Params: ISuperObject; var Result: ISuperObject);
begin
  ....
end;

コンパイル時エラーではなく実行時エラーが発生する理由は、@ 演算子を使用して型システムを放棄したためです。@ を削除すると、プログラムはコンパイル時に失敗し、上で述べたよりも簡潔なエラー メッセージが表示されます。

@ 演算子を使用して関数ポインタを取得しなければならないというのは、Delphi プログラミングの大きな誤りの 1 つです。やめたほうがいいのは悪い習慣です。

于 2013-03-03T15:57:44.350 に答える