Создание объектов JScript с использованием IScriptControl - PullRequest
2 голосов
/ 10 сентября 2009

Есть ли лучший способ создания объектов в IScriptControl, чем этот?

Result := SC.Eval('new Date()');

Мне нужно что-то вроде этого:

function CreateJSObject(JSClassName: string; Params: PDispParams): OleVariant; 

Наивная реализация будет

var 
    S: string;
begin 
    S := '';
    for I := P.cArgs - 1 downto 0 do
    begin
        if S <> '' then
            S := S + ', ';
        S := S + ConvertParamToJSSyntax(OleVariant(P.rgvarg[I]));
    end;
    Result := ScriptControl.Eval('new ' + JSClassName + '(' + S + ');'); 
end;

Ответы [ 2 ]

1 голос
/ 22 сентября 2009

Запрос интерфейса IDispachEx в свойстве CodeObject MSScriptControl. Это указатель на глобальное состояние JScript, и он содержит все объекты, добавленные к нему. Затем выполните InvokeEx с параметром DISPATCH_CONSTRUCT для имени объекта, который вы хотите создать. Это было бы эквивалентно вызову «new».

Это создаст объект правильного типа, и вам не нужно будет преобразовывать его в типы javascript. Вы также сможете передавать нативные объекты в конструктор.

Я знаю, что это работает для конструкторов, определенных в скрипте. Я не уверен насчет Date, который является нативной собственностью.

Это работает на активном хосте сценариев JScript и VBScript, но некоторые другие хосты сценариев не возвращают ничего в CodeObject, поэтому это не очень переносимо.

0 голосов
/ 17 сентября 2009

Чтобы вызвать подпрограмму, вам нужно использовать метод Run вместо Eval. См. этот документ для получения дополнительной информации.

Вы правы, говоря, что "конструкторы - это разные методы", но в этом случае вы на самом деле просто возвращаете вновь созданное значение, не так ли? И поэтому я ожидаю, что все еще смогу использовать Eval ().

У меня работает следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
  ScriptControl: Variant;
  Value: Variant;
begin
  ScriptControl := CreateOleObject('ScriptControl');
  ScriptControl.SitehWnd := Handle;
  ScriptControl.Language := 'JScript';

  Value := ScriptControl.Eval('new Date();');
  ShowMessage(VarToStr(Value));
end;

Когда я нажимаю кнопку, мое ShowMessage появляется с «Ср 16 сентября 23:37:14 TC + 0200 2009».

И поэтому для возврата значения из конструктора вы можете использовать Eval ().

...