在开发的过程中,经过会将一些核心的技术和代码封装想来,部份不同的逻辑由脚本来控制,灵活性比较高。下面是Windows 下使用msscript控件来实例 C++如何Javscript的例子和技巧,其中msscript为Windows系统自带控件,不需要额外下载和注册。
废话不多说,直接上代码。均有详细注释和注意的地方,希望对你有用。
注意:由于关键字在网页中被屏蔽,这里写成java-script,请注意去除中间的横杠。
#include "stdafx.h"
#import "msscript.ocx"
using namespace MSScriptControl;
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr = CoInitialize(NULL);
{
//智能指针包装类,可以在保证 CoUninitialize() 被调用前先释放该指针
IScriptControlPtr pScriptControl;
pScriptControl.CreateInstance(__uuidof(ScriptControl));
pScriptControl->Language = "java-script";
//测试的变量
VARIANT V;
int i = 0;
double d = 0.0;
//1.计算一些表达式的结果值
string strParameters = ("var a = 100; var b = 200;"); //预定一些变量
string strFuncExpress = ("function calculate(str) { return (str); }");
string strDescExpress = strParameters + strFuncExpress;
try {
pScriptControl->AddCode(strDescExpress.c_str());
V = pScriptControl->Eval("calculate((a + b)/2);");
//作为弱类型语言,变量不需要指明是什么类型,然而在C++中是需要区分的
//这里得到的结果值是整形
if (VT_I1 == V.vt //char
|| VT_I2 == V.vt //short
|| VT_I4 == V.vt //long
|| VT_I8 == V.vt) //long long
{
//V.intVal = 150
}
//浮点数
pScriptControl->AddCode(strDescExpress.c_str());
V = pScriptControl->Eval("calculate(a * Math.PI);");
if (VT_R4 == V.vt //float
|| VT_R8 == V.vt) //double
{
//V.dblVal = 314.15926535897933
}
}catch(_com_error e)
{
//异常处理
}
//2.调用函数来执行一些操作
strFuncExpress = ("function add(a, b) { return (a + b); }");
strDescExpress = ("add(1, 2);");
pScriptControl->AddCode(strFuncExpress.c_str());
V = pScriptControl->Eval(strDescExpress.c_str()); //3
//支持重载
strFuncExpress = ("function add(a, b, c) { return (a + b + c); }");
strDescExpress = ("add(1, 2, 3);");
pScriptControl->AddCode(strFuncExpress.c_str());
V = pScriptControl->Eval(strDescExpress.c_str()); //6
//传的参数可以比函数接受的多
//pScriptControl->Reset(); //调用Reset重置,之前添加的代码将被清空,如果还调用被清空的函数或变量将报错
strDescExpress = ("add(1, 2, 3, 4);");
V = pScriptControl->Eval(strDescExpress.c_str()); //6
//3.传递一个对象,我们这里传递一个JSON字符串,在中,一切皆对象
pScriptControl->AddCode("function print(pt) { return (\"x:\" + pt.x + \" y:\" + pt.y); }");
V = pScriptControl->Eval("print({x:\"100\", y:\"200\"})");
if (VT_BSTR == V.vt)
{
wstring str = (wchar_t *)V.bstrVal; //Unicode
wcout<<str<<endl;
}
}
::CoUninitialize();
system("pause");
return 0;
}注意:在调用Eval执行脚本时时记得try/catch,避免脚本错误而导致程序异常退出。
本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!