有没有更好的方法在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;
答案 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()。