关于nw.js桌面程序开发和inno setup 打包心得

这篇文章主要是你做好nw.js应用后到打包成exe安装程序的过程

# 首先压缩命令生成app.nw,(整个地方遇见的问题主要有window上压缩的方式生成的app.nw不能用,整个时候你需要用mac 或者上传到服务器上去压缩,下面是压缩命令,如果不知道app.nw是什么为什么生成,请看nw.js官网具体讲解)
zip -r app.nw jynotify/

# 执行nw.js合并文件命令
copy /b nw.exe+app.nw xxx.exe

# 利用Resource Hecker软件更换图标和版本信息(整个软件可以更换上一命令生成的xxx.exe的图标和版本信息版权等基本信息)

# 图标使用128X28 ico格式

下面一部分主要是inno setup打包步骤:

主要有三个问题点:

1:如何自动创建桌面图标

首先要根据自己的项目信息来自动创建一个innoset的导报程序

# 利用Inno setup进行打安装包,填写基本信息后需要修改脚本Tasks(代码块)-Flag 为 checkablealone即可自动创建桌面图标

# 最后复制code安装代码块脚本, 其中NewAPPID是本版本安装包的appid,oldAPPID是之前版本的appid,添加那个版本的appid 就会检测有之前安装的版本然后卸载之前版本安装新版本

2:如果安装的时候如何试别程序正在运行并且杀死进程

3:如何检测老版本和本版本已安装并卸载已存在的版本

code 代码块主要解决2,3问题

注意事项:一、想要检测已经运行的进程并且杀死需要借助istask.dll编译库,这个编译库需要复制到inno setup安装目录一份和生成xxx.exe文件同级目录一份

dll下载链接:https://pan.baidu.com/s/1fxqFCldVpYh7GBJTH2dKvw 提取码: ztej

二、版本更新问题,检测已有版本安装,每次inno setup 打包的程序都会生成一个appid,这个appid是你这个安装程序唯一标识,下面InitializeSetup函数中的两个if判断将识别此程序和以前的程序是否已经安装,如果已经安装进行卸载,将代码中的NewAppId和OldAppId替换成自己的appid{x-xxxx-xxxx-xxx-xxxx}+_is1就可以了,如果找不到之前打包的脚本从而找不到appid,那么可以在注册表中找到,一般位置在HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{836C144D-BC4B-4412-B968-5E41E3D1104E}_is1

[Setup]
; 注意: AppId 的值是唯一识别这个程序的标志。
; 不要在其他程序中使用相同的 AppId 值。
; (在编译器中点击菜单工具 - 产生 GUID可以产生一个新的 GUID)
AppId={{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}

 

 

 

[code]
//安装前判断是否有进程正在运行,istask.dll文件放到innosetup安装目录
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';


function InitializeSetup(): Boolean;
  var
    ResultStr: String;
    ResultCode: Integer;
  // 检测本版本是否已安装
  begin
    Result:= true;
    if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NewAPPID_is1', 'UninstallString', ResultStr) then
        begin
          ResultStr := RemoveQuotes(ResultStr);
          Exec(ResultStr, '/silent', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
        end;
    // 检测之前版本是否已经安装
    if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OldAPPID_is1', 'UninstallString', ResultStr) then
        begin
          ResultStr := RemoveQuotes(ResultStr);
          Exec(ResultStr, '/silent', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
        end;
    if RunTask('{#MyAppExeName}', false) then
        begin
          KillTask('{#MyAppExeName}');
          Result:= true;
        end
    else
    Result:= true;
  end;


// 卸载前判断进程是否在运行,istask.dll文件与打包的exe文件一起
function RunTaskU(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}/ISTask.dll stdcall delayload uninstallonly';
function KillTaskU(ExeFileName: string): Integer;
external 'KillTask@{app}/ISTask.dll stdcall delayload uninstallonly';


function InitializeUninstall(): Boolean;
  begin
    Result:= true;
    if RunTaskU('{#MyAppExeName}', false) then
      begin
        KillTaskU('{#MyAppExeName}');
        Result:= true;
      end
    else
    Result:= true;
    UnloadDll(ExpandConstant('{app}/ISTask.dll'));
  end;

有问题请留言

 

 

 

最新回复(0)
/jishuzilRceI7ie0c3Em0VZ_2BgZS7_2B3UYIjo2jQzXuKA_3D_3D4858683
8 简首页