Как использовать интерфейсы в скриптах

отредактировано 18:47 Раздел: FastScript
Добрый день,

Можно ли использовать интерфейсы (наследники от IUnknown) в скриптах?

Пытался зарегистрировать интерфейс через метод AddClass, но ничего не получилось. Компилятор выдает ошибку: [Error] MainFormUnit.pas(38): Incompatible types: 'TClass' and 'TGUID'

Привожу код, который я пытался использовать:
unit MainFormUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  fs_iinterpreter, fs_ipascal, StdCtrls;

type

  ITestInterface = interface(IUnknown)
  ['{352D3E1F-C08C-486F-8C56-35036D99F492}']
    procedure TestMethod;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    fsScript: TfsScript;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  fsScript:= TfsScript.Create(Nil);
  fsScript.Parent:= fsGlobalUnit;
  fsScript.SyntaxType := 'PascalScript';

  fsScript.AddClass(ITestInterface, 'IUnknown');

  fsScript.Lines.Text:= 'begin ShowMessage(''Hello!''); end.';
  if fsScript.Compile then
    fsScript.Execute
  else
    ShowMessage(fsScript.ErrorMsg);
  fsScript.Free;
  fsScript:= Nil;

end;

end.

Что я делаю не так?

Я сейчас пытаюсь понять, подойдет ли мне FastScript и использование интерфейсов для меня очень важно.

Надеюсь на вашу помощь.

С уважением,
Михаил Третьяков

Комментарии

  • отредактировано 18:47
    Интерфейсы регистрировать не надо. Достаточно добавить переменную типа variant и обращаться к ней, как к классу. Пример:
    fsScript1.Variables := myIntf; // экземпляр интерфейса
    скрипт:
    myVar.testMethod;
  • отредактировано 18:47
    AlexTZ написал:
    Интерфейсы регистрировать не надо. Достаточно добавить переменную типа variant и обращаться к ней, как к классу. Пример:
    fsScript1.Variables := myIntf; // экземпляр интерфейса
    скрипт:
    myVar.testMethod;
    Попробовал так сделать. Ничего не получилось.
    Вызывается исключение "Invalid variant type convsion" внутри метода fsScript.Compile

    Может ли так быть, что для работы вашего кода необходимо, чтобы интерфейс наследовался от IDispatch?

    А если IDispatch не используется, т.е. интерфейс наследуется напрямую от IUnknown, то можно ли его все таки заставить работать в скриптах?

    С уважением,
    Михаил Третьяков
  • отредактировано 18:47
    Точно, нужен IDispatch, забыл упомянуть.
  • отредактировано 18:47
    AlexTZ написал:
    Точно, нужен IDispatch, забыл упомянуть.
    А без IDispatch никак нельзя?

    Может быть есть какой-то способ испльзования IUnknown-интерфейсов?

    С уважением,
    Михаил Третьяков
  • отредактировано 18:47
    Других способов нет.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.