C++通过Microsoft Script Control控件调用JS脚本

本文介绍如何利用Microsoft的ScriptControl组件执行如JavaScript等脚本。通过详细示例展示了在控制台程序和MFC中使用ScriptControl的方法,包括设置语言、添加脚本代码和执行脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时在程序开发中,需要在程序中调用一些比如javascript这样的脚本,Microsoft为我们提供了Script Control组件即是用于实现这样的功能。
Script Control是一个ActiveX控件,它的函数都封装在了msscript.ocx文件中,我们可以直接下载该文件即可。

ScriptControl接口

属性:
AllowUI 检测是否允许运行用户的接口元素。如果为False,则诸如消息框之 类的界面元素不可见。
CodeObject 脚本暴露给宿主调用的对象。只读。
Modules 宿主提供给脚本的组件库模块。只读。(COM组件通常都是以对象收集的形式向用户提供可以留给用户二次开发的对象集合,每一个 收集即一个Modules)
Language 设置或获取脚本引擎解释的语言,例如:VBScript、JScript。
Name 脚本引擎的名称。只读。
Procedures 返回模块中定义的过程的集合
SitehWnd 在脚本中显示UI的父窗口句柄
State 设置或返回控件的状态,如果为0,控件只执行语句但不转发事件,为1则为加入的本控件接受的对象转发事件。
Timeout 控件的执行脚本的超时值,-1表示不超时
UseSafeSubset 设置或返回宿主程序是否关心安全。宿主程序的安全级别可以从此属性设置
Error 错误对象,发生错误时,此属性返回一个错误对象

方法:
AddCode 往脚本引擎中加入要执行的脚本
AddObject 往脚本引擎加入一个对象,以便在脚本中可以使用该 对象提供的方法等。
Eval 表达式求值
ExecuteStatement 解释并执行脚本语句
Reset 丢弃所有的对象和代码,将State属性置0。
Run 运行一个指定的过程

在控制台程序中调用

Microsoft Script Control的调用比较简单,首先创建ScriptControl对象,然后设置语言类型,调用AddCode写入脚本代码,最后调用Run或Eval执行脚本。

#include "stdafx.h"
#import "D:/msscript.ocx"  // msscript.ocx 
using namespace MSScriptControl;
int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr = CoInitialize(NULL); 
    IScriptControlPtr pScriptControl(__uuidof(ScriptControl)); 
    pScriptControl->Language = "JavaScript"; //脚本类型
    pScriptControl->AllowUI = TRUE;
    pScriptControl->AddCode("function output(){return 12;}");//脚本代码
    VARIANT a;
    //a = pScriptControl->Run("output", NULL);
    a = pScriptControl->Eval("output()");//执行脚本
    printf("%d\n", a.intVal);
    return 0;
}

调用Run方法时,第一个参数是脚本的函数名,第二个参数是一个SAFEARRAY类型的数组,存储脚本的参数。
调用Eval方法直接传入脚本函数及带有的参数表即可,比如可以这样:pScriptControl->Eval(“output(1, 2)”);

在MFC中调用

在MFC中首先要将组件添加到工具箱中。
在工具箱中随便选个项,右键,选择“选择项”。
这里写图片描述
在弹出对话框中选择“COM组件”,点击“浏览”,添加msscript.ocx文件。
这里写图片描述
这样,在工具箱中就可以看到出现了一个ScriptControl Object选项。将它拖入窗口中,右键添加变量。并且可以直接在右侧栏中对AllowUI等属性进行编辑。

然后我们添加一个按钮,处理单击事件

void CMFCScriptControlTestDlg::OnBnClickedButton1()
{
    TCHAR script[MAX_PATH] = L"function output(){return 2;}";
    m_sc.AddCode(script);//
    VARIANT A = m_sc.Eval(L"output()");
    TCHAR str[MAX_PATH] = {0};
    wsprintf(str, L"%d", A.intVal);
    MessageBox(str);
    // TODO: 在此添加控件通知处理程序代码
}
详见http://bbs.csdn.net/topics/390381933 另外里面有几个控件可能也用得着,你懂的。 驱动器 C 中的卷没有标签。 .\MSSCRIPT\VBE600CHS1\script 的目录 2013/08/19 11:03 <DIR> . 2013/08/19 11:03 <DIR> .. 1998/08/05 04:12 <DIR> CHINESE 1998/07/29 18:59 109,969 DISPEX.DLL 1998/07/29 18:59 1,209,970 JSCRIPT.DLL 1997/05/24 17:16 2,154 MSSCRIPT.CNT 1997/05/24 17:16 70,780 MSSCRIPT.HLP 1998/05/01 08:39 133,392 MSSCRIPT.OCX 1998/05/13 06:53 576 README.TXT 1998/07/29 18:59 989,779 VBSCRIPT.DLL 7 个文件 2,516,620 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE 的目录 1998/08/05 04:12 <DIR> . 1998/08/05 04:12 <DIR> .. 1998/08/05 04:12 <DIR> CONTROLS 1998/08/05 04:12 <DIR> CRYSREPT 1998/08/05 04:12 <DIR> MSAGENT 2013/08/19 11:03 <DIR> SCRIPT 2013/08/19 11:14 <DIR> WINLESS 0 个文件 0 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE\CONTROLS 的目录 1998/08/05 04:12 <DIR> . 1998/08/05 04:12 <DIR> .. 1997/03/19 11:40 28,160 DBGRDCHS.DLL 1997/03/19 11:40 86,016 MSCHTCHS.DLL 2 个文件 114,176 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE\CRYSREPT 的目录 1998/08/05 04:12 <DIR> . 1998/08/05 04:12 <DIR> .. 1997/03/18 19:40 21,504 CC245CHS.DLL 1 个文件 21,504 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE\MSAGENT 的目录 1998/08/05 04:12 <DIR> . 1998/08/05 04:12 <DIR> .. 1998/02/25 03:10 328,336 MSAGENT.CHS.EXE 1 个文件 328,336 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE\SCRIPT 的目录 2013/08/19 11:03 <DIR> . 2013/08/19 11:03 <DIR> .. 1998/06/15 04:46 18,104 JSCHS.DLL 1998/05/01 08:38 13,584 MSSCRCHS.DLL 1994/04/04 03:23 2,420 MSSCRIPT.CNT 1994/04/04 03:34 239,528 MSSCRIPT.HLP 1998/06/15 04:46 14,632 VBSCHS.DLL 5 个文件 288,268 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE\WINLESS 的目录 2013/08/19 11:14 <DIR> . 2013/08/19 11:14 <DIR> .. 1998/06/18 00:39 13,690 LTWTCT98.CHI 1998/06/18 00:39 19,382 LTWTCT98.CHM 2013/08/19 11:14 24,427 LTWTCT98.chw 1998/07/08 11:00 32,768 MSWLSCHS.DLL 4 个文件 90,267 字节 所列文件总数: 20 个文件 3,359,171 字节 20 个目录 984,694,784 可用字节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值