在开发的过程中,经过会将一些核心的技术和代码封装想来,部份不同的逻辑由脚本来控制,灵活性比较高。下面是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,避免脚本错误而导致程序异常退出。
本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!