C++ MFC调用JS代码获取返回值

news/2024/11/8 17:04:35/

    C++有时候会需要调用JS代码,这对于C++来说或者对于国内来说一直是比较蛋疼的问题,主要是资料少,微软提供了一个COM组件,里面包含有JS引擎,这个组件就是:msscript.dll。

    此文件在C:\Windows\SysWOW64目录下,这个COM组件里不止有JS引擎还有VB的引擎,也就是可以传入VB的代码获得返回值。但简中网络上此组件的资料少之又少,鄙人也是拿来主义,用老前辈提供的一个操作msscript.dll的类来调用JS,特此写下这篇帖子记录使用过程,以免忘记,为以后再次使用提供说明。

    首先导入前辈提供的一个MSJsMgr.h文件和MSJsMgr.cpp文件,此操作类提供了若干函数,测试后发现就下面这个能用:

runScriptString(generd, urant);//执行字符串格式的 JS 脚本

    此操作类提供了从JS文件加载JS脚本的方法,估计是输入目标文件地址的处理有问题,也搞不清是哪里有问题,目前只有上面那个函数能用,鄙人的办法就是把JS脚本存在一个txt文件里,然后用API读出文件里的文本,在用上面的函数调用,效果也是差不多的。

    但是要注意txt文件里的JS脚本不能有换行,需要把JS脚本里的换行全部删除后才能成功调用;至于怎么向JS脚本里的函数输入参数,这里可以用CString类型里的字符串处理方法来插入字符串。

   下面是一个例子:

(function(){return ;})();

目标是在return 后插入2+3,这样JS脚本执行后会返回5。

把上面这段脚本存入一个txt文件里:ChunGe.txt

	CMSJsMgr mport;CString estion, generd;CStdioFile f1;//定义文件对象CFileException fileException;//打开失败后的异常处理对象//打开文件f1.Open(L"D:\\C Engineering\\Urren\\Release\\ChunGe.txt", CFile::typeText|   CFile::modeRead,&fileException);setlocale(LC_CTYPE, "chs");//加入此设置才能正常读取汉字f1.ReadString(generd);//把txt文件中的文本全读出来存入generd变量int ached=generd.Find(L"return");//查找returnached += 7;//"return"字符串的有多少个字符+一个空格 一共有7个字符,移动7位generd.Insert(ached,L"2+3");//在指定索引位置插入一个字符串 在return+空格 后面插入2+3mport.initGlobalContext(); //初始化 msscript.dll_variant_t urant = "春哥\n";bool stau = mport.runScriptString(generd, urant);//执行字符串格式的 JS 脚本estion = urant;if (stau){WriteConsole(hdlWrite, L"执行成功\n", CString(L"执行成功\n").GetLength(), NULL, NULL); //向DOS窗口里输出字符串WriteConsole(hdlWrite, estion, CString(estion).GetLength(), NULL, NULL); //向DOS窗口里输出字符串}else{WriteConsole(hdlWrite, L"执行失败\n", CString(L"执行失败\n").GetLength(), NULL, NULL); //向DOS窗口里输出字符串}

相当于:(function(){return 2+3;})();

执行后的结果:

经过测试

evalFunction();//执行 JS 脚本中的全局函数

这个方法也是可以用的,想使用此方法需要先加载JS脚本,此方法用于调用已经加载到内存中的JS脚本里的函数,不过此函数无法调用JS对象中的方法,也就是例如:

var ChunGe=new Object()

ChunGe.getName = function(){ return this.name; }

此函数无法调用ChunGe.getName(),而只能调用正常形式的函数例如:

function haha(){}

下面是调用的例子:

    CMSJsMgr mport;//CMSJsMgr操作JS的类CJsArray udgei;//CJsArray是向JS里传参数传用的类mport.initGlobalContext(); //初始化CStdioFile f1;//定义文件对象CFileException fileException;//打开失败后的异常处理对象f1.Open(L"D:\\C Engineering\\Urren\\Release\\ChunGe.txt", CFile::typeText| CFile::modeRead,&fileException);//打开文件setlocale(LC_CTYPE, "chs");//加入此设置才能正常读取汉字f1.ReadString(generd);//把txt文件中的文本全读出来存入generd变量_variant_t urant = "春哥\n";bool stau = mport.runScriptString(generd, urant);//执行字符串格式的 JS 脚本long stion = 10;long stion_2 = 5;udgei.pushElement(stion);//压入参数1udgei.pushElement(stion_2);//压入参数2//参数1:JS脚本中要执行的函数名;参数2:此JS函数需要的参数;参数3:接收返回值的变量bool merits = mport.evalFunction(L"kk", &udgei, urant);//执行 JS 脚本中的全局函数

理论上

//参数1:类名;参数2:要调用的类的方法成员;参数3:输入参数的对象;参数4:接收返回值的变量

evalObjFunction()//执行 JS 脚本中某个对象的方法函数

这个方法应该也能用,但没有测试,这个方法就可以调用ChunGe.getName()这样的JS对象里的方法,同样的,使用前需要先加载JS脚本,然后才能调用脚本中的函数。

文中提到的类文件:https://download.csdn.net/download/l198738655/87770918


http://www.ppmy.cn/news/64063.html

相关文章

webpack 5 实战(3)

四十一、代码拆分方式 通过Webpack实现前端项目整体模块化的优势很明显,但是它同样存在一些弊端,那就是项目当中所有的代码最终都会被打包到一起,试想一下,如果说应用非常复杂,模块非常多的话,那打包结果就…

有哪些入耳舒服的蓝牙耳机?公认佩戴舒适度最高蓝牙耳机

数码科技市场日益发展的更加智能化,日常所接触到的各类产品都开始往智能化发展,鲜为人知的蓝牙耳机一直是不过时的,因为小巧易携带深受大众喜欢,下面整理了几款佩戴舒适的蓝牙耳机给大家。 一、南卡小音舱Lite2蓝牙耳机 售价&am…

spi 设备注册分析

/* * spi 设备注册分析 */ 1. kernel/drivers/spi/spi.c 初始化设备 device_initialize /* 调用device_initialize 的会有这些函数 */ spi_match_controller_to_boardinfo spi_new_device spi_alloc_devi…

二、PEMFC基础之电化学与反应动力学

二、PEMFC基础之电化学与反应动力学 1.电流、电流密度2.反应速率常数3.交换电流密度4.电化学动力学奠基石B-V方程5.活化损失计算Tafel公式6.计算案例 1.电流、电流密度 由法拉第定律 i d Q d t n F d N d t i\frac{dQ}{dt}\frac{nFdN}{dt} idtdQ​dtnFdN​ j i A j\frac{…

474. 一和零

目录 1、题目描述 2、思路:动态规划01背包 2.1、确定dp数组及下标含义 2.2、确定递归数组 2.3、初始化 2.4、确定遍历顺序 1、题目描述 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多…

精炼计算机网络——物理层(二)

文章目录 前言2.4信道复用技术2.4.1 频分复用、时分复用和统计时分复用2.4.2 波分复用2.4.3 码分复用 2.5 数字传输系统2.6 带宽接入技术2.6.1 ADSL技术2.6.2 光纤同轴混合网(HFC网)2.6.3 FTTx技术 总结 前言 上篇文章,我们初步了解了物理层…

Java设计模式-装饰模式

简介 装饰模式在Java领域是一种常见的设计模式,它能够在不改变对象原有结构的情况下,动态地为对象添加新的功能。它通过封装原有对象,在运行时动态地为对象添加新的行为或者修改原有行为,以扩展对象的功能。这种方式避免了继承的…

Python 操作 Excel,如何又快又好?

➤数据处理是 Python 的一大应用场景,而 Excel 则是最流行的数据处理软件。因此用 Python 进行数据相关的工作时,难免要和 Excel 打交道。Python处理Excel 常用的系列库有:xlrd、xlwt、xlutils、openpyxl ◈xlrd - 用于读取 Exce…