如何在Windows下的V8Nodejs中实现ActiveXObject

如何在Windows下的V8Nodejs中实现ActiveXObject,第1张

1 网上找的实现方法

网上找了半天,没有一个实现的解决方案。那些大侠们的江湖可能都是Linux,从来不 *** 心Windows的。找到唯一靠谱的解决方案如下:

参见1:用nodejs访问ActiveX对象,以 *** 作Access数据库为例。这个总体上来说是利用Windows自带的脚本解释器来调用ActiveXObject,然后将处理结果返回给主进程。由于是两个进程之间的数据交换,也就只能局限于类文本数据;而涉及到动态对象的交换,就无能为力。但是,作为处理中间交换结果的简单小型的解决方案来说,还是可以的。

参见2:我是如何用 V8 脚本引擎替换JScript的。这个绝对是最彻底的解决方案,而且成文时间比较早,都在2009年。可惜作者懒了,以后就没有下文了。即便找到作者的工作室雨寒工作室主要原创作品预览,也是需要等待发布。

然后然后就只能靠自己了。

2 实现ActiveXObject的几种方法

其实以前用IE自带的JScript引擎,实现自己的应用程序和js相互调用,为自己的应用程序添加脚本支持,已经知道JScript的原理:一切皆组件,一切皆IDispatch和IDispatchEx。但是V8绝对不会支持微软的COM组件的,也就谈不上去实现Jscript中的大门ActiveXObject了;这也宣告利用V8时,不能方便简单的使用微软的组件。真是可惜啊!

其实让V8、NodeJS在Windows下来支持微软的组件一定可行的。动手实现之前想的三个方法是:

要用哪个组件,就将该组件动态转换为JS对象。

当然可以提供应用工具实现,其实就是遍历一个组件的接口类型库信息

难点在于方对象和子对象的层层连接

速度会比较快,因为事先已经将所有的方法或属性固定已知了,都省去根据名称找方法一步

比较浪费。如果有时只想调用组件中的几个方法而已的话

想在JS层次上拦截对方法或属性的调用,统一变成调用IDispatch::Invoke。

利用JS的AOP之类技术等等;或者eval、apply等函数

AOP大多数都是对已知对象方法属性的代理;但是组件引入在js中却是未知属性和方法,只有在调用时转成Invoke

如何在V8引擎中拦截脚本的属性或方法调用,转换为IDispatch::Invoke调用。

利用拦截器可以实现对所有方法和属性的访问,并转到IDispatch::Invoke这个函数中

要处理V8::Value和VARIANT的数据之间相互转换

对于对象的属性又是对象这种情况一定要处理好

注意优化,避免内存泄露

这几种方法,第一种知道可行,但是没有做;第二种宣告失败;第三种历经波折多次柳暗花明和死胡同交相辉映,但大抵宣告成功还有点瑕疵。

3 如何实现ActiveXObject的一种最简单方法

还有两个细节没有处理明白:

V8的String如何转换为BSTR,总是失败

NodeJS的addon插件,居然存在内存泄露。压根就没有释放掉ObjectWrap。自带的例子也如是!

解决完这两个bug后再放上代码。

顶层对象,在浏览器中指的是window,在node环境中指的是global对象

在ES5环境中,通过var声明的变量能够通过window对象获取到,

各种环境中顶层对象的区分

1浏览器里面,顶层对象是window,但 Node 和 Web Worker 没有window。

2浏览器和 Web Worker 里面,self也指向顶层对象,但是 Node 没有self。

3Node 里面,顶层对象是global,但其他环境都不支持。

代码如下:

function checkUnfined(value){

if(typeof(value)=='undefined'){

return "";

}

return value;

}

nodejs

Nodejs是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。Nodejs对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。

V8引擎执行Javascript的速度非常快,性能非常好。Nodejs是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Nodejs 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。

如果正在使用一系列node模块,或许是一个像Expressjs一样的框架,突然需要使用几个全局变量。怎样在nodejs里创建全局变量呢?

对此最常见的建议是“不使用‘var’关键字声明一个变量”或“给object对象添加一个变量”或“给OBJECT对象添加一个变量”。你会使用哪种方式呢?

首先,让分析下global对象。打开一个终端,启动一个node命令提示界面:

[plain] view plain copy print

$ node

>

在命令提示界面下看看关于global的所有信息:

[plain] view plain copy print

> global

那是一个超级大的对象!事实上,看到了node的核心。所有在node进程里的对象都挂在这个对象上。如果非常熟悉javascript所在的浏览器环境,global对象是等同于window对象。

现在已经指导global对象是声明

[plain] view plain copy print

> globalname

undefined

> globalname = 'El Capitan'

> globalname

'El Capitan'

> GLOBALname

'El Capitan'

> delete globalname

true

> GLOBALname

undefined

> name = 'El Capitan'

'El Capitan'

> globalname

'El Capitan'

> GLOBALname

'El Capitan'

> var name = 'Sparrow'

undefined

> globalname

'Sparrow'

令人兴奋的观察!

global和BLOBAL看起来是一个同一个东西且是一回事。确实,Global是global一个别名。

感兴趣的是一个使用还是不使用var关键字声明的变量附加到global对象上。在node里创建一个全局变量的最基本的方式就是通过不使用var关键字声明一个变量。这种做法与使用一个模块(module)略有不同

当启动一个node进程,将会启动一个模块,那么所有的模块将会被包含在它里面,所有模块都共享同一个global对象。应用上面的测试观察结合实际,你就会明白全局变量怎样在node里工作。然而有些轻微的变化,如果使用var关键字声明的变量将会保留在本地模块里;这些声明的变量没有附加到global对象里。

那么现在已经知道”没有使用var关键字声明的变量“,”向global里添加一个变量“,”给GLOBAL对象添加一个变量“,所有这些都是一回事。

在一个module里全局声明的变量能够被其他任何模块使用它们的名字来引用,没必要从global对象引用它们。但是这不意味这你就可以这样做。为什么呢?请看这样:

[plain] view plain copy print

var company = 'Yahoo';

consolelog(globalcompany); // 'Google'

consolelog(company); // 'Yahoo'

当使用globalcompany时,知道使用的是全局变量,但是它的备用名字company在module是当作局部变量来使用的。

如果打算在你的node应用里使用全局变量,那么讨论的创建变量方法会工作的很好。然而,请不要过度使用它。话虽如此,还有可以不使用全局对象的替代解决方案吗?

是的,有这么一个,它涉及到moduleexports的使用。使用例子来演示:

File: mainjs

[plain] view plain copy print

exportscompany = 'Google';

var m = require('/mod');

File: modjs

[plain] view plain copy print

var company = require('/main')company;

consolelog(company);

现在看看执行结果:

[plain] view plain copy print

$ node mainjs

Google

这样就实现了,一个其他模块的的变量可以在另外的模块中使用他而没有使用global对象。可以include mainjs在其他的module来访问company名字。

注意:引用(include)一个已经被其他模块引用过的模块时,仅仅创建一个指向之前包体的引用,因此这意味着不会极度消耗内存。也因为没有重新创建一个真正的包体,在module里的所有初始化方法没有再执行。

因此,一个包体中,有2钟创建node全局变量的方法,一个是使用global对象,另一个是使用modulesexports。global方法适用小的应用,modulesexprots适用于大的应用。

以上就是关于如何在Windows下的V8/Nodejs中实现ActiveXObject全部的内容,包括:如何在Windows下的V8/Nodejs中实现ActiveXObject、nodejs的顶层对象是什么、nodejs中怎么判断一个对象类型等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10114109.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存