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

2023-05-16

    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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ MFC调用JS代码获取返回值 的相关文章

  • MFC中Tree(CTreeCtrl)中添加特定树项的图标

    我们可以为特定的树项目添加图标吗 我使用以下功能添加带有图标的项目 HTREEITEM InsertItem LPCTSTR lpszItem int nImage int nSelectedImage HTREEITEM hParent
  • MFC winMain 如何最终进入可执行文件?

    In MFC wWinMain定义于appmodul cpp 据我所知 该文件内置于 mfc90ud dll 中 但是 当我运行我的应用程序时 调用堆栈显示MyApplication exe wWinMain 它是如何采取的wWinMain
  • 有效的 MFC ID 范围

    这让我很困惑 我正在读这个技术说明 https learn microsoft com en gb cpp mfc tn020 id naming and numbering conventions它指出 Prefix Resource t
  • VC++中如何判断链接是否存在?

    我有一个链接 我已通过正则表达式检查该链接是否是有效的 URL 现在 我想检查该链接是否是有效的 http 链接 即它不应该是不存在的链接 VC 6 0 MFC 有办法检查吗 一种选择是尝试使用以下方法从该 URL 获取数据URLOpenB
  • 托管和非托管 C++/MFC 可以混合在一个 dll 中吗?

    以前 我们有 MFC VC6 VB6 和 C 应用程序中的软件 需要调用用 C 和 MFC 编写的相同引擎 该引擎需要 C 来提高速度 当时我们决定使用 COM 作为接口 因为所有三个都可以使用它 并且在编组等方面的问题最少 我们的 MFC
  • CloseWindow和WM_CLOSE有什么关系

    我现在有点困惑 是吗 WM CLOSE http msdn microsoft com en us library windows desktop ms632617 28v vs 85 29 aspx and CloseWindow htt
  • 默认情况下启用或禁用菜单项。为什么?

    我有一些遗留代码 由于某种原因 菜单项在启动时被启用或禁用 我的问题是 如何 有没有办法在不调用 EnableMenuItem 函数的情况下执行此操作 MFC 有没有办法做与资源设置所说相反的事情 我也不明白为什么当最后一个子窗口关闭时 当
  • 当窗口未最大化时缺少 WM_NCLBUTTONUP 消息的奇怪问题

    我有一个处理 WM NCLBUTTONUP 消息的窗口 以便处理标题栏中自定义按钮的点击 当窗口最大化时 这非常有效 但当窗口未最大化时 WM NCLBUTTONUP 消息永远不会到达 不过我确实收到了 WM NCLBUTTONDOWN 消
  • MFC 是否提供了将文本放入剪贴板的快速方法?

    我们的代码库中的添加到剪贴板代码非常低级 分配全局内存等等 对于简单的情况 我只想将一些纯文本放在剪贴板上 是否有任何例程可以包装所有这些内容 一个例子是 CRichEditCtrl 具有 Copy 和 Cut 方法 可以自动将当前选择放入
  • 想要将 ColeDateTime 转换为 CTime

    我正在从数据库中读取日期时间ColeDateTime格式 我想将其转换为CTime获取日期 月份 年份和时间 CString repDt this will hold the datetime which i read from Datab
  • 实现批量记录获取

    在程序开始时 我需要将数据从 MS Access 数据库 mdb 读取到下拉控件中 这样做是为了每当用户在该控件中键入内容时 应用程序都可以自动完成 不管怎样 从数据库中读取数据花了很长时间 所以我想我应该实现批量行获取 这是我的代码 CS
  • 获取正在运行的程序的属性

    我想开发一个程序 其 ID 是一张牌 因为它在另一个正在运行的程序 例如扑克或红心游戏或其他程序 中播放 我首先尝试获取有关已运行的游戏程序的所需信息 但我从一开始就遇到了问题 我正在运行 MSVC 2013 并开发 MFC 应用程序 现在
  • 捕获由纯 C++ dll 中的 MFC 应用程序生成的 Windows 消息

    首先 这可能吗 我有一个与某些硬件接口的第三方 dll 它是用MFC编写的 我 从 dll 供应商处 收到了一个示例 Visual Studio 2010 解决方案 该解决方案只有一个项目 调用相关第三方 dll 的 MFC 应用程序 ex
  • 错误 C2248: 'CObject::CObject' : 无法访问类 'CObject' afxwin.h 中声明的私有成员

    我试图让班级负责在灰色背景上放置一些文本 Score h pragma once class Score public Score Score void UpdateScore int points void UpdateLives int
  • 如何在 MFC 中创建带圆角的进度控件?

    我需要在 MFC 应用程序中创建一个带圆角的进度条 我尝试过使用 CreateRoundRectRgn 和 SetWindowRgn 的组合 它具有使控件完全消失的效果 我还尝试使用透明的 GIF 覆盖层 该覆盖层将绘制在进度栏的顶部 但我
  • 发送WM_SETTEXT时如何避免EN_CHANGE通知?

    我有一个 CEdit 派生控件 当基本数据为空时 该控件显示字符串 N A 我最近添加了代码 以在控件获得焦点时清空控件 SetWindowText 并在用户离开焦点时将其设置回 N A SetWindowText N A 控空 唯一的问题
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • 如何在MFC中对CListCtrl中的Item进行排序?

    我在 MFC 中制作了一个基于对话框的应用程序 我将 CListCtrl 控件放在对话框上 并将其视图样式设置为报告类型 我在此列表视图中有五列 所有列都是字符串类型 我想在此列表中实现排序 也就是说 当我单击某一列时 它应该对列表中的项目
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • C++ 中的转换错误

    有人可以帮我解决这个错误吗 我是 C 新手 看来错误就发生在一堆宏中 我能做什么来解决它 或者我怎样才能追踪到它的源头 我真的不明白这个错误 这是否意味着编译器尝试转换该方法void ReadCPUparameter to a LRESUL

随机推荐

  • WORD论文撰写中的必备技巧-公式与排版

    word撰写科技论文时 xff0c 经常会遇到下列问题 xff1a xff08 1 xff09 公式大小与文字不匹配 xff1b xff08 2 xff09 公式对齐问题 xff1b xff08 3 xff09 公式编辑的字符在段落中如何与
  • AirSim(五)---理解篇: Airsim世界坐标系、NED坐标系、机体坐标系以及控制相关API接口函数

    目录 1 坐标系 coordinate system 1 AirSim API的坐标系 xff1a NED 坐标系 with SI unit 2 Unreal Engine的坐标系 xff08 3 xff09 AirSim全局坐标系 61
  • 【部署】外网访问家庭计算机( 内网穿透)

    场景 很多时候需要通过远程访问来进行跨网络跨机器 大部分的场景是访问公司机器 这种一般比较容易实现 xff0c 因为公司都是固定ip xff0c 或者有vpn服务等等 实在不行也可以有teamviewer xff0c anydesk xff
  • 使用wxWidgets开发跨平台的GUI程序

    使用wxWidgets开发跨平台的GUI程序 Taii 回家念经 2006 05 20 1 探索背景 xff1a 1 1 引言 从开始使用c c 43 43 编码起算来也快有5年了 xff0c 期间完成了无数项目 xff0c 编写了无数程序
  • R-4.0.2 forecast预测

    library 34 forecast 34 skirts lt scan 34 http robjhyndman com tsdldata roberts skirts dat 34 skip 61 5 skirtsts lt ts sk
  • Linux远程连接图形界面的几种方法

    1 xff0c 利用Xmanager xff0c linux启用XDMCP协议 xff08 可直接修改配置文件 xff0c 也可以采用在Xshell中运行gdmconfig或gdmsetup xff0c 选择XDMCP选项卡 xff0c 勾
  • 什么是视图?作用是什么?

    1 1 视图 1 1 1 什么是视图 视图 VIEW 也被称作虚表 xff0c 即虚拟的表 xff0c 是一组数据的逻辑表示 其本质是对应于一条SELECT语句 xff0c 结果集被赋予一个名字 xff0c 即视图名字 视图本身并不包含任何
  • Python元组(tuple)详解

    目录 一 元组的基本概念 xff1a 二 元组的特点 xff1a 1 声明方式 2 访问方式 xff1a 3 元组中元素的修改 xff1a 三 xff0c 对元组的操作 1 元组的切片 xff1a 2 元组的拼接 xff1a 3 元组与数字
  • 解决debian下thinkpad x1没有声音的问题

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 问题描述 一 解决方法 二 解决步骤 1 使用non free源 2 更改参数 3 更新源信息 4 安装以下驱动包 5 重启 问题描述 安装完debian 11后
  • windows环境变量配置你知道吗?

    1 什么是windows环境变量 xff1f 我们直接看百度的专业解释 环境变量 xff08 environment variables xff09 一般是指在操作系统中用来指定操作系统运行环境的一些参数 xff0c 如 xff1a 临时文
  • C# 远程RDP共享桌面,控制桌面,远程桌面登录注销,用户切换,包括客户端,服务端软件及代码

    可以一次打开16个桌面 可以支持登录切换用户 包含客户端NoteWin exe WINDOWS服务NoteWinService exe xff0c 当前用户服务NoteWService exe xff0c 远程启动服务AppLoad exe
  • 树莓派3B+ 网页控制GPIO(WebIOPi)

    树莓派3B 43 网页控制GPIO xff08 WebIOPi xff09 对于没接触编程的小白来说 xff0c 让他们编程控制树莓派的GPIO口输出输入 xff0c 那简直就是折磨人 xff0c WebOPi就是一个开源 方便 实用的网页
  • 解决Win10 自动更新问题(可以认为永久关闭更新)

    解决Win10 自动更新问题 xff08 可以认为永久关闭更新 xff09 这是我意外想到的一个方法 xff0c 步骤十分简单 xff0c 什么都不用设置 xff0c 不过每隔35天就要操作一下 xff0c 因为win10最多临时暂停35天
  • * failed to start daemon *解决方法

    16 11 23 error could not install smartsocket listener cannot bind to 127 0 0 1 5037 通常每个套接字地址 协议 网络地址 端口 只允许使用一次 10048 1
  • 【工具】验证是否安装cuda和cuDNN

    验证是否安装cuda 验证cuda是否安装方法1 span class token keyword import span torch span class token keyword print span span class token
  • 常用的url链接

    maven库 xff1a https mvnrepository com 一些基本工具的安装和语法 xff0c 如mysql docker https www runoob com docker centos docker install
  • 达梦7数据库后台导入导出命令解释

    达梦7使用的dexp和dimp xff0c 用法和exp和imp类似 xff0c 在命令后直接加上help可以查看帮助 吐槽一下竟然没有 dexp dimp help或 xff1f 这种操作 xff0c 必须是help才可以识别 格式 de
  • 麒麟V10修改root密码

    不知为何 xff0c root密码登录不上去 xff0c 几番测试都说是密码错误 基本环境 xff1a 国产服务器和麒麟V10 人不在机房 步骤如下 xff1a 1 连接服务器 xff0c 打开带外界面 2 打开控制台界面 3 重启电脑 x
  • python 图片文字提取

    转载 xff1a python怎么读取png python 图像处理 天道酬勤 花开半夏 图像处理不是一件简单的工作 对你来说 xff0c 一看到某样东西 xff0c 马上就知道你在看什么很容易 但是 xff0c 电脑不是这样工作的 对你来
  • C++ MFC调用JS代码获取返回值

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