node-webkit 和 inno setup:安装包的那点事儿
2014-08-11 · 601 chars · 4 min read
node-webkit 是个很赞的想法,奈何问题较多,很多在目前的版本下难以解决(异形窗口之类的)…..这次总结下安装包的制作,使用到了inno setup,网上有很多教程,需要的可以自行搜索,下面主要讲下我在打包 node-webkit应用的时候遇到的问题。
卸载(安装)的时候删除注册表#
我的 node-webkit 应用可以设置开机自启动,会写入到注册表中,在卸载的时候需要删除注册表项目,用法很简单,在 iss 文件里加入一行:
[Registry] Root: HKCU; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: <键名>; Flags: dontcreatekey uninsdeletevalue
上面的代码是卸载时删除注册表的(uninsdeletevalue),具体关于[Registry]
的可以看官方的文档。
安装和卸载的时候判断程序是否正在运行#
卸载 inno setup 打包的 node-webkit 应用时,如果程序正在运行,会卸载不完全(主要文件都还在,而且还可以运行),所以要检测一下,如果程序正在运行,就弹出提示,退出卸载。安装也是同样的道理。这里用到了两个函数InitializeSetup
和InitializeUninstall
,分别在安装和卸载时执行。具体代码如下:
[Code] function IsAppRunning(const FileName : string): Boolean; var FSWbemLocator: Variant; FWMIService : Variant; FWbemObjectSet: Variant; begin Result := false; FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator'); FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', ''); FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName])); Result := (FWbemObjectSet.Count > 0); FWbemObjectSet := Unassigned; FWMIService := Unassigned; FSWbemLocator := Unassigned; end; function InitializeSetup(): Boolean; begin if IsAppRunning( '<这里是实际运行的exe>.exe' ) then begin MsgBox( '"<你的程序>" is running, please close it and run again setup.', mbError, MB_OK ); Result := false; end else Result := true; end; function InitializeUninstall(): Boolean; begin if IsAppRunning( '<这里是实际运行的exe>.exe' ) then begin MsgBox( '"<你的程序>" is running, please close it and run again uninstall.', mbError, MB_OK ); Result := false; end else Result := true; end;
卸载时删除指定文件夹#
node-webkit 包含一个 webkit 的内核,卸载之后,他的 cookie 和 localStorage 都会保留,这显然不是我们想要的,所以在卸载之后(或者安装之前)要删除这些数据:
[InstallDelete] Type: filesandordirs; Name: "{localappdata}\your-app-name" [UninstallDelete] Type: filesandordirs; Name: "{localappdata}\your-app-name"
上面的{localappdata}
就是本地的数据目录,下面有个和你的应用同名的目录,是 node-webkit 创建的,直接删除即可。