C++ 与 JavaScript 互操作

C++ JavaScript 互操作

cheungmine

2007-4-8

——伎俩和技巧——

 

我们不需要自己创建脚本引擎,就可以使我们的程序能以最灵活的方式处理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的开源代码。

 

Rust是一种现代的、安全的系统编程语言,而互操作性则是指不同系统、程序或平台之间进行交互的能力。那么,Rust与互操作性之间的关系如何呢? 首先,Rust在设计时考虑到了与其他编程语言的互操作性。通过FFI(Foreign Function Interface)机制,Rust可以与C语言进行无缝的交互。这意味着Rust可以直接用C语言的函数,也可以被其他语言用。这种互操作性使得Rust可以与现有的C/C++代码库进行集成,而不需要从头开始重写。 其次,Rust还提供了与其他高级语言(如Python、JavaScript等)的互操作性。例如,Rust可以通过将其编译为WASM(WebAssembly)模块,使其可以在Web平台上与JavaScript进行交互。这样,开发者就可以在Rust中编写高性能的底层代码,然后与前端的JavaScript进行通信,实现更好的性能和扩展性。 此外,Rust还提供了用于与操作系统、硬件和其他编程语言进行低级别互操作的特性。例如,Rust的标准库提供了用于直接访问内存或处理原始指针的类型和函数。这使得Rust在编写操作系统、驱动程序等底层系统软件时具有很高的灵活性。 总之,Rust在语言设计和工具链上考虑了互操作性,使得它可以与其他编程语言和平台进行无缝交互。这使得Rust在编写高性能、安全的系统软件时具有优势,同时也能够与现有的代码库和其他开发者进行良好的集成。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

车斗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值