首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IScriptControl创建JScript对象

使用IScriptControl创建JScript对象
EN

Stack Overflow用户
提问于 2009-09-10 07:23:11
回答 2查看 1.6K关注 0票数 2

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

代码语言:javascript
复制
Result := SC.Eval('new Date()');

我需要这样的东西:

代码语言:javascript
复制
function CreateJSObject(JSClassName: string; Params: PDispParams): OleVariant; 

一个简单的实现是

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-22 13:28:45

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

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

我知道这对脚本中定义的构造函数有效。我不确定Date,它是一个原生属性。

这在JScript和VBScript活动脚本主机上有效,但其他一些脚本主机在CodeObject上不返回任何内容,因此这不是非常可移植的。

票数 1
EN

Stack Overflow用户

发布于 2009-09-16 21:45:14

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

你说“构造函数是不同种类的方法”是正确的,但在这种情况下,你实际上只是返回新构造的值,不是吗?因此,我希望仍然能够使用Eval()。

以下代码适用于我:

代码语言:javascript
复制
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()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1403801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档