他小的有

C++调用Javscript实例

        在开发的过程中,经过会将一些核心的技术和代码封装想来,部份不同的逻辑由脚本来控制,灵活性比较高。下面是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,避免脚本错误而导致程序异常退出。

本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!

0
分享到:

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址