文档章节

node-webkit浏览器插件注册升级方式

tinderfang
 tinderfang
发布于 2015/01/27 21:35
字数 839
阅读 119
收藏 0

node-webkit浏览器插件注册升级方式,调用srver32,reg等系统层方法来实现。本人对这些方法封装实现了插件检查是否注册,注册表插件版本检查,升级功能,写成一个公共模块分享出来。

var async = require('async');
var path = require('path');
var exec = require('child_process').exec;
var gui = global.window.nwDispatcher.requireNwGui();

/*插件对像格式,要传入这个格式的对像去执行各项操作*/
var plugin={
version:"1",
name:"chrScpCaptureKTP",
description:"screenCapture",//不能有空格
filename:"chrScpCapKTP.dll",
regLocal:"HKEY_LOCAL_MACHINE\\SOFTWARE\\MozillaPlugins\\chrScpCap",
dll:[path.join(__dirname,"../../lib/ScreenCapture/ScreenCaptureKTP.dll")],
path:path.join(__dirname,"../../lib/ScreenCapture/chrScpCapKTP.dll")
}

var Register = function(){
var THIS=this;
/* 注册系统组件
*输入DLL文件名时,如果待处理的是非系统文件,必须在文件名前添加文件绝对路径,必须注意的是文件路径不包含中文,否则很可能导致处理失败。
*regsvr32 [/u] [/s] [/n] [/i[:cmdline]] DLL文件名 
*/
this.regsvr32 = function(method,dllPath,callback){
if(method!=="add"&&method!=="delete"){
return callback("regsvr32不支持该方法")
}
try{
var parm = (method == "delete")?" /u ":" ";
var regStr ="regsvr32 /s"+ parm+" "+dllPath;
console.log("REG32",regStr)
exec(regStr,{encoding: 'utf8'},callback);
}catch(err){
console.err("注册系统组件失败",err)
callback("注册系统组件失败"+err);
}
};
/* 注册表注册
* method 类别: "add"|| "delete"||"query"
* keyName 名称,如: "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"
* entryName 项名称
* value  写入值, "String"
* valueType 值类型, "REG_SZ"等注册表值类型
* force bool, 强行覆盖已存在的键值
*/
this.reg = function(method,keyPath,KeyName,value,valueType,force,callback){
if(method!=="add"&&method!=="delete"&&method!="query"){
return callback("注册表不支持该方法")
}
try{
var regStr ="reg "+ method+" "+keyPath;
if(KeyName){
regStr += " /v "+KeyName;
}
if(value){
regStr += " /d "+value;
}
if(valueType){
regStr += " /t "+valueType;
}
if(force){
regStr += " /f";
}
console.log("REG",regStr)
exec(regStr,{encoding: 'utf8'},callback);
}catch(err){
console.error("注册表操作失败",err);
callback("注册表操作失败"+err);
}
};
// 通用注册插件到注册表
this.execreg =function(plugin,callback){
try{
async.auto({
       regMenu: function(cb,results){
       THIS.reg("add",plugin.regLocal,null,null,null,true,cb)
       },
       regDescription: ["regMenu",function (cb, results) {
           THIS.reg("add",plugin.regLocal,"Description",plugin.description,"REG_SZ",true,cb)
       }],
       regPath: ["regMenu",function (cb, results) {
           THIS.reg("add",plugin.regLocal,"Path",plugin.path,"REG_SZ",true,cb)
       }],
       regProductName: ["regMenu",function (cb, results) {
           THIS.reg("add",plugin.regLocal,"ProductName",plugin.name,"REG_SZ",true,cb)
       }],
       regVersion: ["regMenu",function (cb, results) {
           THIS.reg("add",plugin.regLocal,"Version",plugin.version,"REG_SZ",true,cb)
       }]
   }, function(err, results) {
      console.log("execreg完成",plugin.name,err,results)
  callback&&callback(err,results)
});
}catch(err){
console.error("REG"+plugin.name,err)
callback&&callback(err)
}
};
// 安装插件
this.installPlugin = function(plugin,callback){
async.auto({
reg32:function(cb,results){
async.each(plugin.dll,function(dll,each_cb){
THIS.regsvr32("add",dll,each_cb);
},cb)
},
regedit:["reg32",function(cb,results){
THIS.execreg(plugin,cb)
}]
},function(err,results){
if(err){
console.error("安装插件失败",err)
}else{
console.log("安装插件成功",results)
}
  callback(err,results)   
})
};
// 移除插件
this.removeplugin = function(plugin,callback){
async.auto({
reg32:function(cb,results){
async.each(plugin.dll,function(dll,each_cb){
THIS.regsvr32("delete",dll,each_cb);
},cb)
},
regedit:["reg32",function(cb,results){
THIS.reg("delete",plugin.regLocal,"","","",true,cb)
}]
},function(err,results){
if(err){
console.error("移除插件失败",err)
}else{
console.log("移除插件成功",result)
}
  callback(err,results)   
})
};
// 检查插件是否存在
this.checkPlugin = function(plugin){
for (var i = 0, l = global.window.navigator.plugins.length; i < l; i++)
{
if (global.window.navigator.plugins[i].filename == plugin.filename)
{
return true;
}
}
return false;
};
// 获取插件版本
this.getPluginVersion = function(plugin,callback){
var regLocal=plugin.regLocal;
reg("query",regLocal,"Version",null,null,null,function(err,stdout,stderr){
var version=0;
if(stdout.match(/[\d.]+/ig)){
version=stdout.match(/[\d.]+/ig)[0];
}
callback&&callback(err,version,stderr)
})
};
// 升级插件
this.updatePlugin = function(plugin,callback){
console.log("updatePlugin","getPLugnin",this.checkPlugin(plugin),plugin.name)
if(!this.checkPlugin(plugin)){
this.installPlugin(plugin,callback)
}else{
this.getPluginVersion(plugin,function(err,version){
if(err){
callback(err)
}else{
console.log("updatePlugin","version",plugin.version)
if(version<plugin.version){
THIS.installPlugin(plugin,callback)
}else{
callback(null)
}
}
})
}
};
}

var register = exports = module.exports = new Register();
module.exports.Register = Register;


© 著作权归作者所有

tinderfang
粉丝 4
博文 12
码字总数 4847
作品 0
深圳
架构师
私信 提问
node-webkit:开发桌面+WEB混合型应用的神器

大漠穷秋 2014-01-31 bla...bla... 顾名思义,node-webkit就是nodejs+webkit。 这样做的好处显而易见,核心奥义在于,用nodejs来进行本地化调用,用webkit来解析和执行HTML+JS。 快速上手 下...

随影求是
2014/01/31
0
4
node-webkit v0.7.2 发布

node-webkit 是一个基于 Chromium 和 Node.js 的 Web 运行环境,可让你直接在 DOM 中调用 Node.js 模块,并可使用任何现有的 Web 技术来编写本地应用。 下载地址: https://s3.amazonaws.com...

打杂程序猿
2013/08/27
2.5K
11
开发桌面应用框架 - Atom Shell

Atom Shell 现已改名为 Electron atom-shell 是 GitHub 随 Atom 一起开源的跨操作系统(Windows,Linux,MacOS X)的利用 Web 技术(Node.js、JavaScript、HTML 5)开发桌面应用的框架。Ato...

匿名
2014/08/04
0
16
Node-Webkit能够做什么呢?

我是一个新手(真的很新。。。),所以如果下面问到大神们不喜欢的千万别喷我!!! 这两天我看到了haXe这个项目,然后我就来了兴趣,我看了一些资料,接着我又了解到node-webkit和CEF这些软...

hangvo
2013/10/31
29.2K
10
node-webkit serialport问题

开发一个node-webkit客户端应用 需要用到serialpost, 安装了python2.7.3和vs2013desk版本,安装好node-gyp node-pre-gyp后,然后直接用名称npm install serialport一下卡在 serialport@4.0.7...

帅鱼
2017/02/24
168
1

没有更多内容

加载失败,请刷新页面

加载更多

计算机网络

计算机网络体系结构 OSI 其中表示层和会话层用途如下: 表示层 :数据压缩、加密以及数据描述,这使得应用程序不必关心在各台主机中数据内部格式不同的问题。 会话层 :建立及管理会话。 五层...

一只小青蛙
今天
2
0
0.01-Win10安装linux子系统

一、安装Debian子系统 -1、控制面板设置: -1.1、打开“控制面板” —— “程序” —— “启用或关闭Windows功能” —— 勾选 “适用于Linux的Windows子系统” -2、设置: -2.1、打开“设置”...

静以修身2025
昨天
2
0
init 0-6 (启动级别:init 0,1,2,3,4,5,6)

启动级别: init 0,1,2,3,4,5,6 这是个很久的知识点了,只是自己一直都迷迷糊糊的,今天在翻出来好好理解下。。 0: 停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system...

圣洁之子
昨天
2
0
Android Camera HAL浅析

1、Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为电信号,经过A/D(模数转...

天王盖地虎626
昨天
2
0
聊聊Elasticsearch的ProcessProbe

序 本文主要研究一下Elasticsearch的ProcessProbe ProcessProbe elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/process/ProcessProbe.java public class ProcessProb......

go4it
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部