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;