有比这更好的在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;发布于 2009-09-22 13:28:45
在MSScriptControl的CodeObject属性上查询IDispachEx接口。它是JScript全局状态上的指针,它包含添加到其中的所有对象。然后在要创建的对象名称上使用DISPATCH_CONSTRUCT参数执行InvokeEx。这相当于调用"new“。
这将创建一个正确类型的对象,并且您不必将它们转换为javascript类型。您还可以将本机对象传递给构造函数。
我知道这对脚本中定义的构造函数有效。我不确定Date,它是一个原生属性。
这在JScript和VBScript活动脚本主机上有效,但其他一些脚本主机在CodeObject上不返回任何内容,因此这不是非常可移植的。
发布于 2009-09-16 21:45:14
要调用子例程,需要使用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()。
https://stackoverflow.com/questions/1403801
复制相似问题