7

参照が与えられた場合、対応するorIScriptObjにどのように到達しますか?IInfoTProgramInfo


Delphi オブジェクトをラップするスクリプト オブジェクトがあります。

スクリプト オブジェクトの存続期間を管理するために、Delphi オブジェクトはスクリプト オブジェクトへの参照を格納します。Script オブジェクトはTdwsUnitコンポーネントで宣言されます。それはかなり標準的で、次のようになります。

デルファイ

type
  TDelphiObject = class
  private
    FScriptObject: IScriptObj;
  public
    procedure DoSomething;
    property ScriptObject: IScriptObj read FScriptObject write FScriptObject;
  end;

脚本

type
  TScriptObject = class
  protected
    procedure DoSomething; virtual;
  public
    constructor Create;
  end;

Delphi オブジェクトのインスタンス化と Delphi/スクリプト リンクの設定は、スクリプト オブジェクト コンストラクタの Delphi 実装で行われます。また、かなり標準的です:

デルファイ

// Implements TScriptObject.Create
procedure TMyForm.dwsUnitClassesTScriptObjectConstructorsCreateEval(Info: TProgramInfo; var ExtObject: TObject);
var
  DelphiObject: TDelphiObject;
  DelphiObjectInfo: IInfo;
begin
  // Create the Delphi-side object
  DelphiObject := TDelphiObject.Create;

  // Get the script object "self" value
  DelphiObjectInfo := Info.Vars['self'];

  // Store the ScriptObject reference
  DelphiObject.ScriptObject := DelphiObjectInfo.ScriptObj;

  // Return the instance reference to the script
  ExtObject := DelphiObject;
end;

理想的には、後で必要なすべてを実行するのではなく、参照を保存したはずですが、経験から、オブジェクトIInfoはメソッド呼び出しの間のみ有効であるようです。IScriptObjIInfoIInfo

とにかく、TDelphiObject.DoSomethingDelphi 側で が呼び出されたときに問題が発生します。 TDelphiObject.DoSomethingスクリプト オブジェクトで対応する仮想メソッドを呼び出すためのものです。

デルファイ

procedure TDelphiObject.DoSomething;
var
  Info: IInfo;
  DoSomethingInfo: IInfo;
begin
  // I have a IScriptObj but I need a IInfo...
  Info := { what happens here? };

  // Call the virtual DoSomething method
  DoSomethingInfo := Info.Method['DoSomething'];
  DoSomethingInfo.Call([]);
end;

IInfo使用可能なものを取得するため、またはTProgramInfo保存されたものを取得するためにさまざまな手法を試しましたIScriptObjが、すべてが失敗しました。それで、これを行う正しい方法は何ですか?

4

1 に答える 1