基于QtIFW创建程序安装包,卸载程序快捷方式创建

概述

  • 本文将介绍如何创建桌面快捷方式
  • 本文将介绍一种卸载前监测程序运行时中断卸载流程
  • 本文演示代码基于官方的tutorial
  • 本文演示代码下载

卸载前监测程序运行

  • 自己尝试了好多基于QtIFW的安装包,发现,软件运行时,都能顺利卸载软件
  • 实现目标:软件运行时,卸载程序启动时能提示软件正在运行,同时中断卸载流程。便有了此文。

环境

  • QtIFW版本: 4.5.2, 下载地址
  • 操作系统: windows 11

目录结构

  • 运行安装包一键生成.bat 即可生成安装包, 不过, 需要将 Qtifw/bin的目录设置到系统环境变量
.
│  安装包一键生成.bat
│  
├─config
│      config.xml
│      controlscript.js
│      
└─packages
    └─com.vendor.product
        ├─data
        │      installcontent.txt
        │      
        └─meta
                installscript.js
                package.xml

创建快捷方式

  • 这里演示,使用Uninstaller.exe的卸载快捷方式放在桌面
  • installscript.js文件:packages\com.vendor.product\meta\installscript.js (官方先前为qs文件,自己测试改为了js)
  • 关键代码: createOperations 中创建快捷方式。
 component.addOperation("CreateShortcut", "@TargetDir@/Uninstaller.exe", "@DesktopDir@/卸载.lnk");
  • 文件内容
function Component()
{
}

Component.prototype.createOperations = function()
{
    try 
    {
        // call the base create operations function
        component.createOperations();
        /// 创建快捷方式
        component.addOperation("CreateShortcut", "@TargetDir@/Uninstaller.exe", "@DesktopDir@/卸载.lnk");
    } 
    catch (e) 
    {
        console.log(e);
    }
}

卸载检测是否程序是否运行

这里演示, 检测Notepad3.exe是否运行

  • 1 切换到 config目录,
  • 2 创建名为controlscript.js脚本文件
  • 3 打开config目录下的config.xml文件,增加以下关键代码
    <MaintenanceToolName>Uninstaller</MaintenanceToolName>
    <ControlScript>controlscript.js</ControlScript>

此时, config.xml文件内容为

<?xml version="1.0" encoding="UTF-8"?>
<Installer>
    <Name>Your application</Name>
    <Version>1.0.0</Version>
    <Title>Your application Installer</Title>
    <Publisher>Your vendor</Publisher>
    <MaintenanceToolName>Uninstaller</MaintenanceToolName>
    <ControlScript>controlscript.js</ControlScript>
</Installer>

注意, config.xml中的MaintenanceToolName值需要与 packages/com.vendor.product/meta/installscript.js中Uninstaller.exe保持一致

  • 5 编写controlscript.js文件内容并保存
function Controller()
{
    if (installer.isUninstaller())
    {
        if (installer.isProcessRunning("Notepad3.exe"))
        {
            QMessageBox.critical("卸载", "提示", "Notepad3.exe正在运行,请退出软件后,再卸载");
            /// 因为没有从官方QTIFW提供的文档中找到如何中途退出Maintanencetool.exe的函数,
            /// 但是这里又需要中断卸载流程。 
            /// 投机取巧, 执行一个installer不存在的函数exit,用于中断卸载流程
            installer.exit();
        }
    }
}
  • 6 运行安装包一键生成.bat, 即可在与安装包一键生成.bat同级目录下生成安装包

测试

  • 安装上面生成的安装包
  • 启动Notepad3.exe
  • 运行桌面生成的卸载快捷方式

将提示Notepad3.exe正在运行,请退出软件后,再卸载

卸载中断流程关键代码

  • 翻遍了QtIFW的官方文档,没有提及如何中断卸载流程和相关范例。便使用取巧的方式,执行了一个installer的不存在的函数exit, 用于中断卸载流程。
  • 若看到这里的你知道如何使用Maintanencetool.exe卸载程序前检测程序运行后中中断卸载流程, 请留言交流 。 😄
  • 中断卸载流程关键代码
/// 因为没有从官方QTIFW提供的文档中找到如何中途退出Maintanencetool.exe的函数,
/// 但是这里又需要中断卸载流程。 
/// 投机取巧, 执行一个installer不存在的函数exit,用于中断卸载流程
installer.exit();
posted @ 2023-06-07 18:42  mohist  阅读(545)  评论(1编辑  收藏  举报