`
cloudtech
  • 浏览: 4590713 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C++ 与 JavaScript 互操作

 
阅读更多

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 非对称加密的JavaScriptC++实现。使用这个技术可以在不改变网站安全设置的情况下,达到军事级别的安全。可以建设银行、证券、军事等高度安全的Web应用。而且整个实现是跨平台的。它使用了斯坦福大学和Wei DaiCryptoPP的开源代码。

分享到:
评论

相关推荐

    WebBrowser介绍——Javascript与C++互操作.doc

    WebBrowser介绍——Javascript与C++互操作

    精通.NET互操作.part1

    但是如果你需要经常使用C++调用C#模块,C#调用C++模块,Javascript调用C++的模块的话,这本书看一下还是有必要的。 对神一样的人来说,这本书只是基础而已,都是很表层的东西。对于咱们为了活命的,这本书就是一本...

    基于GraalVM的ECMAScript 2020兼容Javascript实现。 具有多语种语言的互操作性支持。-C/C++开发

    以最佳性能执行JavaScript代码与最新的ECMAScript规范完全兼容支持Node.js应用程序,包括本机软件包(选中)允许从基于Nashorn或Rhino的应用程序简单升级与Java,Scala或Java的快速互操作性Kotlin或其他GraalVM语言...

    node-php-embed:Node.js流程中PHP和JavaScript代码之间的双向互操作性

    节点php-embed包绑定到PHP的“嵌入式SAPI”,以便在单个过程中提供PHP和JavaScript代码之间的双向互操作性。 当前需要Node / iojs&gt; = 2.4.0,因为我们在实现中使用NativeWeakMap 。 可以使用v8隐藏属性解决此问题...

    Open-Dis C++编译版本

    DIS是由仿真互操作性标准组织(SISO)开发并由IEEE批准的IEEE标准(`IEEE-1278.1`)。 它被广泛用于实时虚拟世界的军事模拟。DIS是一个网络协议。 它描述了几十个协议数据单元(PDU)的确切布局,其中包含有关世界中...

    clipp c++ interpreter framework-开源

    一个C ++库,可实现C ++和解释语言(例如javascript)之间的无缝互操作性。 大致基于boost.python项目。 提供了一个单独的javascript解析器。

    MetaCall:终极的多语言编程经验。-C/C++开发

    // 7 shell metacall main.js MetaCall是一个可扩展,可嵌入且可互操作的跨平台多语言运行时。 它支持NodeJS,Vanilla JavaScript,TypeScript,Python,Ruby,C#,Go,C,C ++,Rust,D,Cobol等。 安装Th

    Uranium:CEF在虚幻引擎中的快速通用实现

    铀 针对虚幻引擎的CEF的...Javascript互操作 在HTML内容上调用任意JavaScript代码 从Javascript读取或操作任何UObject或UStruct 属性更改的回调。 计划 使用铀的高级资产类型 SVG资产(带有动画)(+ Slate / UMG小

    liquid-cpp:一个C ++液体解析器,着眼于可嵌入性,性能,可扩展性,沙盒性和多语言互操作

    它旨在为以下几种语言的液体使用提供官方支持: C ++ C RubyPerl其他语言(Javascript,Python等)可能会在以后出现,但对它们的任何支持将是非官方的。目标这是我针对此库所追求的最高理念。模块化的流程的所有...

    matlab代码影响-veneer:在C++上不是那么薄的单板

    matlab代码影响在C ++上不是那么薄的单板 ...++子集并保持与现有代码的完全互操作性 用什么语言编写编译器? 主要选择 Haskell缺点:我不知道Haskell既不是源语言,中级语言也不是目标语言。优点:我知道函数式

    java关于字符串拼接的笔试题-test:Git测试(私有)

    和动态语言的互操作性 C++:编译成机器码 你好,世界 Python2 print "Hello World" Python 3 print ( "Hello World" ) # "Hello World\n" print ( "Hello" , "World" , sep = "/" ) # "Hello/World

    bugrep-taocpp-json-api

    taoJSON是仅提供C ++标头的JSON库,提供通用的,使用与C ++类型进行互操作,使用在JSON,JAXN,CBOR,MsgPack和UBJSON之间进行转换。 文献资料 (需要C ++ 17) 警告:文档目前还没有完全跟上1.0.0之前的大型开发...

    taocpp-json-api

    taoJSON是仅提供C ++标头的JSON库,提供通用的,使用与C ++类型进行互操作,使用在JSON,JAXN,CBOR,MsgPack和UBJSON之间进行转换。 文献资料 (需要C ++ 17) 警告:文档目前还没有完全跟上1.0.0之前的大型开发...

    DeskGap:基于Node.js和系统Webview的跨平台桌面应用程序框架

    Node.js互操作需要Internet Explorer 11 如果明确指定,Trident也可用。 资料下载 预建的二进制文件 npm install --save-dev deskgap API演示 DeskGap API演示应用程序显示了一些具有交互式脚本的DeskGap功能和API...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java开源包1

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包11

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包2

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

Global site tag (gtag.js) - Google Analytics