首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区

  • 技术部落
  • 部落首页 > 程序开发 > C/C#/C++ > 正文
  • 在CPP中调用Jscript中的函数
      2007-2-25  来源:网络资源  编辑:Jsbulo  热度:

    在 CPP 中调用 Jscript 中的函数

    在 C++ 中调用 Jscript 的函数非常简单, Windows 提供了一个 msscript.ocx 的控件,利用这个控件可以直接操作 Jscript: 执行一段 Jscript 脚本,或者调用指定的函数。我写了一个简单的例子:

    l 导入 msscript.ocx 。下面这条指令会在项目目录中生成 msscript.tli 和 msscript.tlh 两个文件,里面有 msscript.ocx 中所有接口的描述和 IID 的定义。

    #import "msscript.ocx" no_namespace

    l 声明一个对象。

    CComPtr < IScriptControl > m_iScriptControl;

    l 创建对象实例

    if ( SUCCEEDED ( m_iScriptControl . CoCreateInstance ( __uuidof ( ScriptControl ))))

    l 设置语言等属性。

    m_iScriptControl -> PutLanguage (L "JScript" );
    m_iScriptControl -> PutAllowUI ( VARIANT_FALSE );

    l 加入 Jscript 代码。

    m_iScriptControl -> AddCode (L "function test(str1, str2) { return str1 + \"-ok-\" + str2; }" );

    l 获得函数,这里要说明的是 GetItem 的参数是 1 到 n ,而不是 0 到 n-1 。

    CComPtr < IScriptProcedureCollection > aProcedureSet = m_iScriptControl -> GetProcedures ();
    long n = aProcedureSet -> GetCount ();
    CComPtr < IScriptProcedure > aProcedure = aProcedureSet -> GetItem ( _variant_t ( n ));
    _bstr_t strFunction = aProcedure -> GetName ();

    l 准备函数参数。

    VARIANT va = {0};
    va . vt = VT_BSTR ;
    n = 2;
    SAFEARRAYBOUND bounds [1] = {0};
    bounds [0]. cElements = n ;
    SAFEARRAY * psa = SafeArrayCreate ( VT_VARIANT , 1, bounds );
    long i = 0;
    for ( i = 0; i < n ; i ++)
    {
    va . bstrVal = SysAllocString (L "test" );
    SafeArrayPutElement ( psa , & i , & va );
    }

    l 调用函数。

    _variant_t Result = m_iScriptControl -> Run ( strFunction , & psa );

    l 释放参数。

    for ( i = 0; i < n ; i ++)
    {
    va . bstrVal = SysAllocString (L "test" );
    SafeArrayGetElement ( psa , & i , & va );
    SysFreeString ( va . bstrVal );
    }
    SafeArrayDestroy ( psa );