node-webkit 和 inno setup:安装包的那点事儿

2014-08-05 · 11 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 应用时,如果程序正在运行,会卸载不完全(主要文件都还在,而且还可以运行),所以要检测一下,如果程序正在运行,就弹出提示,退出卸载。安装也是同样的道理。这里用到了两个函数InitializeSetupInitializeUninstall ,分别在安装和卸载时执行。具体代码如下:

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