使用IScriptControl创建JScript对象

时间:2009-09-10 07:23:11

标签: delphi scripting javascript

有没有更好的方法在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 个答案:

答案 0 :(得分:1)

在MSScriptControl的CodeObject属性上查询IDispachEx接口。它是JScript全局状态的指针,它包含添加到它的所有对象。然后对要创建的对象名称执行带有DISPATCH_CONSTRUCT参数的InvokeEx。这相当于调用“new”。

这将创建一个正确类型的对象,您不必将它们转换为javascript类型。您也可以将本机对象传递给构造函数。

我知道这适用于脚本中定义的构造函数。我不确定Date是一个本地财产。

这适用于JScript和VBScript activescripting主机,但其他一些脚本主机不会在CodeObject上返回任何内容,因此这不是非常便携。

答案 1 :(得分:0)

要调用子例程,需要使用Run方法,而不是Eval。有关详细信息,请参阅this doc

你说“构造函数是不同类型的方法”是正确的,但在这种情况下,你实际上只是返回新构造的值,不是吗?所以我希望仍能使用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显示“Wed Sep 16 23:37:14 TC + 0200 2009”。

因此,为了从构造函数返回值,您实际上可以使用Eval()。