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 创建的,直接删除即可。


