CPP 中调用 Jscript 函数

[来源] 达内    [编辑] 达内   [时间]2012-09-19

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

  在 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 );

资源下载