node-webkit瀏覽器插件註冊升級方式

node-webkit瀏覽器插件註冊升級方式,調用srver32,reg等系統層方法來實現。本人對這些方法封裝實現了插件檢查是否註冊,註冊表插件版本檢查,升級功能,寫成一個公共模塊分享出來。node

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;
相關文章
相關標籤/搜索