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

news2024/10/7 11:28:27

    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");//查找return

	ached += 7;//"return"字符串的有多少个字符+一个空格 一共有7个字符,移动7位

	generd.Insert(ached,L"2+3");//在指定索引位置插入一个字符串 在return+空格 后面插入2+3


    mport.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);//压入参数1
	udgei.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.coloradmin.cn/o/512589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【TA100】6 PC手机图形API介绍

1 电脑的工作原理: 电脑是由各种不同的硬件组成,由驱动软件驱使硬件进行工作。所有的软件工程师都会直接或者间接的使用到驱动。定义:是一个图形库,用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口 (API)。针对GPU。应用端:即我们自己的程序端…

MySql -- JDBC编程

1.Java的数据库编程:JDBC JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java开…

Flutter性能分析工具使用

使用前提 flutter常用的性能分析工具,这些工具都集成在android studio中,基本能满足我们的需求了。在下面介绍的几个工具中,Flutter Performance和Flutter Inspector都能够直接在debug模式下使用,但是DevTools只能在profile模式下…

铁路中的警冲标

1、警冲标的定义 警冲标是用来指示机车车辆停车时,不准向道岔方向或线路交叉点方向越过,以防止停留在该线上的机车车辆与邻线上的机车车辆发生侧面冲突的标志。另外,在出站道岔上,警冲标用来确定站界标位置。 2、警冲标怎么设置 …

nettyspringboot开发即时通讯系统

Netty 和 Spring Boot 是当今应用最广泛的 Java 技术之一,两个框架的集成能够构建出高效、稳定并且易于扩展的即时通讯系统。在本篇文章中,我们将会学习和探讨 Netty 和 Spring Boot 的整合,并且演示如何使用它们来构建一个高效、实时的即时通…

浓缩咖啡会降低2型糖尿病风险?

咖啡是全球消费最频繁的饮料之一,其潜在的健康效应引发了重要的科学研究。先前的研究已经将更高的咖啡摄入量与较低的T2D风险联系起来,但潜在机制仍不清楚。 一项新研究揭示,咖啡有助于降低2型糖尿病的风险。研究人员发现,每天增加…

安装endnote 之后打开word出现乱码

文章目录 1 安装endnote 之后打开word出现乱码3 EndNote X9 插入参考文献常见问题总结4 EndNote X9 快速上手教程(毕业论文参考文献管理器) 1 安装endnote 之后打开word出现乱码 安装了endnote,打开文档后,目录显示这样&#xff…

虹科案例 | 对症下药,零售行业商业智能分析解决方案及应用案例!

零售行业商业智能分析解决方案 Domo为零售、电子商务、物联网等提供数据洞察力 利用数字增强数字程序的应用 -快速迭代并指导数字化程序的应用。 -有效管理“最后一公里”并降低交付成本。 -优化客户体验并不断适应客户的新需求,例如线下实体店可进行在线退货。…

【Hackthebox Stocker】打靶记录

Hackthebox Stocker nmap 扫描一把 得到tcp端口22 80 nmap -sC -sV 10.10.11.196 Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-10 05:51 EDT Nmap scan report for 10.10.11.196 Host is up (0.25s latency). Not shown: 998 closed tcp ports (reset) PORT STAT…

C++:C++Primer Plus(第六版):Chapter16 : string类和标准模板库:智能指针

Chapter16.2 : 智能指针模板类 1.指针指针现实需求1.1 普通指针弊端 1.2 智能指针现实需求2. 智能指针使用范式2.1 下面演绎三种智能指针用法注意一个问题 3. 三种智能指针特点3.1 为何摒弃 auto_ptr 3.2 选用 unique_ptr3.3 选用 shared_ptr4. 应该使用哪种智能指针 本章节我们…

学好数据结构的秘诀

学好数据结构的秘诀 作为计算机专业的一名“老兵”,笔者从事数据结构和算法的研究已经近20余年了,在学习的过程中,也会遇到一些问题,但在解决问题时,积累了一些经验,为了让读者在学习数据结构的过程中少走…

Vue2全家桶 (Vue2、VueRouter、Vuex) 笔记

前言 有错的地方希望大家能够帮忙指正一下;本文只是对Vue2全家桶的基本语法进行记录。给孩子点点关注吧!😭 壹、Vue2 Vue:一个 JavaScript 渐进式框架; 渐进式:逐渐使用,集合更多的功能&am…

一文总结 Google I/O 2023

今日凌晨举行的谷歌 I / O 2023 开发者大会上,如果说和往年有什么不同,那么应该就是更大力度的 All in AI 。 毕竟在去年 I/O 宣布重点投入 AI 之后,年末却被 OpenAI 的 ChatGPT “越塔偷家”,匆忙攒出一个发布会还让 Bard 爆出事…

国内最大规模上云实践 | 鹅厂如何在云原生2.0时代“挖呀挖”?

👉腾小云导读 2022 年 10 月,腾讯自研业务产品全面完成云原生上云。自研业务产品云上规模已突破 5000w CPU,借助云原生的技术优势,全面提升了腾讯自研业务产品的运营效率,在此过程中我们也对腾讯云产品进行了打磨和验证…

适合Python 初学者入门教程和资源

如果您是 Python 的初学者,以下是一些入门教程和资源可以帮助您快速开始: 1、Python 官方教程: Python 官方网站提供了完整的入门教程,包括语言基础、面向对象编程、模块、文件处理等方面的内容。这是一个非常全面和权威的资源。 2、Codecade…

盖雅工场重磅发布「劳动力账户」,助力企业实现全面工时成本管理

2023年5月10日,亚太地区领先的劳动力管理云服务商盖雅工场宣布,在原有的智能排班和实时考勤系统基础之上,正式推出全新模块「劳动力账户」,通过为企业里的每一位员工建立劳动力账户,实现工时与成本的全面管控&#xff…

一文打通原生Shiro使用

目录 环境准备 添加依赖 INI 文件 登录认证 登录认证概念 登录认证基本流程 登录认证实例 身份认证流程 角色、授权 授权概念 授权方式 授权流程 授权实例 Shiro 加密 Shiro 自定义登录认证 环境准备 Shiro不依赖容器,直接创建maven工程即可 添加依…

机器学习——线性回归

机器学习——线性回归 文章目录 机器学习——线性回归[toc]1 模型设定2 训练模型3 模型预测4 交叉验证 基于Python实现线性回归、预测和建模评估。 1 模型设定 以Boston数据集为例,其中MEDV是标签,其余均为特征变量 CRIM per capita crime rate by tow…

玩转ChatGPT:Excel操作初探

一、写在前面 首先还是让小Chat推销下自己: Excel 表格制作是个技术活,你掌握了吗?没关系,现在有了 ChatGPT,让 Excel 辅助操作变得更简单!再也不用苦恼于数据分析和整理了,让 ChatGPT 成为你…

C语言:简单的扫雷游戏

扫雷游戏想必大家都玩过,像一些大佬呀,十几秒能通关,给大佬点赞,那咱们也设计一个扫雷游戏,具体怎么实现呢,跟上我的脚步,看看用C语言怎么实现简单的扫雷游戏。 一:扫雷游戏的框架 二…