2009-09-10 52 views
2

在IScriptControl中创建对象的方法比这更好吗?使用IScriptControl创建JScript对象

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; 
+0

请详细解释。这是没有意义的(至少对我来说)。 – roosteronacid 2009-09-10 13:35:25

+0

IScriptControl是来自Microsoft的Windows脚本宿主的接口。 IScriptControl中有方法用于运行JScr​​ipt方法,添加代码或评估表达式(如上所述)。构造函数是不同的方法。我怎样才能调用构造函数? – kaboom 2009-09-10 19:05:33

回答

1

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

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

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

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

0

要调用一个子程序,你需要使用Run方法,而不是评估和演示。有关更多信息,请参阅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显示了 “周三09月16日23时37分14秒TC + 0200 2009”。

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

+0

谢谢你的回答,但我知道Run(见我以前的评论)和我了解Eval(见帖子)。我正在寻找一种更好的调用构造函数的方法:更快,而无需将参数转换为JavaScript语法。 – kaboom 2009-09-17 06:26:01

+0

现在完全混淆了,对不起。你是什​​么意思“没有将参数转换成JavaScript语法?”在你回复roosteronacid时,你问:“我怎样才能调用构造函数?”但是现在你说你想在不使用JavaScript参数的情况下构造对象?如果你展示了你想要做的一些伪代码,也许它会为我清除一些东西。 – 2009-09-17 08:07:45

+0

我编辑了这个问题。我希望现在更清楚。 – kaboom 2009-09-17 10:50:28