C++ 与 JavaScript 互操作
cheungmine
<chsdate w:st="on" isrocdate="False" islunardate="False" day="8" month="4" year="2007"><span lang="EN-US"><font face="Times New Roman">2007-4-8</font></span></chsdate>
——伎俩和技巧——
我们不需要自己创建脚本引擎,就可以使我们的程序能以最灵活的方式处理JS脚本。
我们经常遇到的情况是:从JavaScript脚本中调用C++对象,解决方法是把C++对象写成COM组件,然后在IE中使用这个组件,如下面的例子:
<HTML>
<HEAD>
<TITLE>MyCOM 控件测试页 - cheungmine@gmail.com</TITLE>
<script language="javascript">
<!--
function useMyCOM()
{
// 创建MyCOM控件, 它是一个地图
var obj = new ActiveXObject(“MyCOM.RootObj);
// 调用MyCOM.RootObj的方法loadInitFile
obj.loadInitFile(“c://cheungmine.ini”);
}
//-->
</script>
</HEAD>
<BODY>
……
</BODY>
</HTML>
可是,如果脱离了IE容器,如何使我们的脚本也能被MyCOM执行呢?换句话说:用户提交一段脚本,如何能被我们的程序动态执行呢?请看下面的代码:
// test.cpp
#include "stdafx.h"
#include <windows.h>
#include <atlbase.h>
#include <Mshtml.h> // 要求Platform SDK
// 使用 MyCOM 控件, 也可以直接使用 #import “../../MyCOM.dll” 语法
#include "../../MyCOM/MyCOM_i.c"
#include "../../MyCOM/MyCOM.h"
// cheungmine 2007-4-8
int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(0);
{
// 创建HTML对象, 尽管我们不使用IE
CComPtr<IHTMLDocument> spHtmlDoc;
HRESULT hr = CoCreateInstance(CLSID_HTMLDocument, 0,
CLSCTX_ALL, IID_IHTMLDocument, (void**)&spHtmlDoc);
ATLASSERT(S_OK == hr);
// 取得Window对象
CComPtr<IDispatch> spDisp;
hr = spHtmlDoc->get_Script(&spDisp);
ATLASSERT(S_OK == hr);
CComQIPtr<IHTMLWindow2> spWindow;
spWindow = spDisp;
// 创建 MyCOM.RootObj 对象
CComPtr<IRootObj> spObj;
hr = ::CoCreateInstance(CLSID_RootObj, 0, CLSCTX_ALL, IID_IRootObj, (void**)& spObj);
ATLASSERT(S_OK == hr);
// 这里使用一个小技巧, 使我们的C++和JS可以共享spObj对象
hr = spWindow->put_opener(CComVariant(spObj)); // 除了opener,没有其它可用
ATLASSERT(S_OK == hr);
// 创建脚本, 这提供了一个灵活的机制
CComVariant vres;
CComBSTR js;
js += "var obj = window.opener; /
alert(obj); /
obj.loadInitFile(/"C:////cheungmine.ini/");"; // 记住是4个 ////
/*---上面的代码也可以这样写, 但是就无法与C++共享对象了---
js += "var obj = new ActiveXObject(/“MyCOM.RootObj/”); /
alert(obj); /
obj.loadInitFile(/"C:////cheungmine.ini/");"; // 记住是4个 ////
---------------------------------------------------------*/
// 执行脚本
hr = spWindow->execScript(js, CComBSTR("javascript"), &vres);
ATLASSERT(S_OK == hr);
}
::CoUninitialize();
return 0;
}
读到这里,我想聪明的读者可以发现使用这个技巧能给我们带来什么好处——我们不需要自己创建脚本引擎,就可以使我们的程序能以最灵活的方式处理JS脚本。这篇短文,除了给大家灵感,别的废话就不说了。
作者:cheungmine
绝对原创的真实作品!转载请注明出处。
下期的文章预告:
关于Web安全之RSA 非对称加密的JavaScript和C++实现。使用这个技术可以在不改变网站安全设置的情况下,达到军事级别的安全。可以建设银行、证券、军事等高度安全的Web应用。而且整个实现是跨平台的。它使用了斯坦福大学和Wei Dai的CryptoPP的开源代码。
分享到:
相关推荐
WebBrowser介绍——Javascript与C++互操作
但是如果你需要经常使用C++调用C#模块,C#调用C++模块,Javascript调用C++的模块的话,这本书看一下还是有必要的。 对神一样的人来说,这本书只是基础而已,都是很表层的东西。对于咱们为了活命的,这本书就是一本...
以最佳性能执行JavaScript代码与最新的ECMAScript规范完全兼容支持Node.js应用程序,包括本机软件包(选中)允许从基于Nashorn或Rhino的应用程序简单升级与Java,Scala或Java的快速互操作性Kotlin或其他GraalVM语言...
节点php-embed包绑定到PHP的“嵌入式SAPI”,以便在单个过程中提供PHP和JavaScript代码之间的双向互操作性。 当前需要Node / iojs> = 2.4.0,因为我们在实现中使用NativeWeakMap 。 可以使用v8隐藏属性解决此问题...
DIS是由仿真互操作性标准组织(SISO)开发并由IEEE批准的IEEE标准(`IEEE-1278.1`)。 它被广泛用于实时虚拟世界的军事模拟。DIS是一个网络协议。 它描述了几十个协议数据单元(PDU)的确切布局,其中包含有关世界中...
一个C ++库,可实现C ++和解释语言(例如javascript)之间的无缝互操作性。 大致基于boost.python项目。 提供了一个单独的javascript解析器。
// 7 shell metacall main.js MetaCall是一个可扩展,可嵌入且可互操作的跨平台多语言运行时。 它支持NodeJS,Vanilla JavaScript,TypeScript,Python,Ruby,C#,Go,C,C ++,Rust,D,Cobol等。 安装Th
铀 针对虚幻引擎的CEF的...Javascript互操作 在HTML内容上调用任意JavaScript代码 从Javascript读取或操作任何UObject或UStruct 属性更改的回调。 计划 使用铀的高级资产类型 SVG资产(带有动画)(+ Slate / UMG小
它旨在为以下几种语言的液体使用提供官方支持: C ++ C RubyPerl其他语言(Javascript,Python等)可能会在以后出现,但对它们的任何支持将是非官方的。目标这是我针对此库所追求的最高理念。模块化的流程的所有...
matlab代码影响在C ++上不是那么薄的单板 ...++子集并保持与现有代码的完全互操作性 用什么语言编写编译器? 主要选择 Haskell缺点:我不知道Haskell既不是源语言,中级语言也不是目标语言。优点:我知道函数式
和动态语言的互操作性 C++:编译成机器码 你好,世界 Python2 print "Hello World" Python 3 print ( "Hello World" ) # "Hello World\n" print ( "Hello" , "World" , sep = "/" ) # "Hello/World
taoJSON是仅提供C ++标头的JSON库,提供通用的,使用与C ++类型进行互操作,使用在JSON,JAXN,CBOR,MsgPack和UBJSON之间进行转换。 文献资料 (需要C ++ 17) 警告:文档目前还没有完全跟上1.0.0之前的大型开发...
taoJSON是仅提供C ++标头的JSON库,提供通用的,使用与C ++类型进行互操作,使用在JSON,JAXN,CBOR,MsgPack和UBJSON之间进行转换。 文献资料 (需要C ++ 17) 警告:文档目前还没有完全跟上1.0.0之前的大型开发...
Node.js互操作需要Internet Explorer 11 如果明确指定,Trident也可用。 资料下载 预建的二进制文件 npm install --save-dev deskgap API演示 DeskGap API演示应用程序显示了一些具有交互式脚本的DeskGap功能和API...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...