Installshield软件项目打包学习

Installshield打包学习记录

个人工作学习的一点点记录,可能有不专业的表述,各位可以提出建议,共同学习。


目录

  • Installshield打包学习记录
    • 一、Installshield的几个事件:
        • 1. Before Move Data(安装数据前)
          • 1.1 OnFirstUIBefore
        • 2. Move Data(安装数据过程中)
          • 2.1 OnGeneratingMSIScript
          • 2.2 OnGeneratedMSIScript
          • 2.3 OnInstallFilesActionBefore
          • 2.4 OnInstallFilesActionAfter
          • 2.5 OnMoving
          • 2.6 OnMoved
        • 3. After Move Data(安装数据后)
          • 3.1 OnFirstUIAfter
          • 3.2 OnMaintUIAfter
          • 3.3 OnEnd
    • 二、Installshield打包过程中的问题
        • 1. 错误6003
        • 2. 错误1014
        • 3. 错误7132
    • 三、可能用到的bat复制执行脚本
        • 1. 复制文件到指定路径
        • 2. 利用脚本安装下载的字体

一、Installshield的几个事件:

下面介绍几个重要的事件,事件分为三大类:

1. Before Move Data(安装数据前)

1.1 OnFirstUIBefore

就是在第一次安装时,在复制安装数据之前触发的事件,更改这个事件的脚本可自定义安装步骤。
例如,我们可以在这里自定义去设定先弹出软件安装欢迎界面、用户注册、安装位置的选择、以及安装模式的定义等等。

举个例子:

function OnFirstUIBefore()NUMBER nResult, nSetupType, nvSize, nUser, nExclusiveType, nNeutrValue, nLength;STRING szConfigXmlPath, szTitle, szMsg, szQuestion, svName, svCompany, szFile, szDeviceType, szText1, szText2, szText3, szText4, szText5, szValueBuf;STRING szLicenseFile;STRING szLanguageCode, szCurUse, szCurInstru;BOOL bCustom, bIgnore1, bIgnore2, bCheck1, bCheck2, bCheck3, bCheck4, bNeutralVer;
begin	// TO DO: if you want to enable background, window title, and caption bar title          // 欢迎界面
Dlg_SdWelcome:szTitle = "";szMsg   = "";nResult = SdWelcome(szTitle, szMsg); if (nResult = BACK) goto Dlg_SdWelcome;// 安装位置自定义
Dlg_SdAskDestPath:szMsg = "";    	nResult = SdAskDestPath(szTitle, szMsg, INSTALLDIR, 0);if (nNeutrValue = 0) then elseif (nResult = BACK) goto Dlg_SdWelcome; endif;// 开始安装复制数据
Dlg_SdStartCopy:szTitle = "";szMsg   = "";nResult = SdStartCopy2( szTitle, szMsg );if (nResult = BACK) thengoto Dlg_SdAskDestPath;endif;SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );// setup default statusEnable(STATUSEX);return 0;
end; 

2. Move Data(安装数据过程中)

这个类型当中的事件一般来说不需要改动。在这里可以做一些软件安装的必需工作,比如你的软件需要mysql数据库支持,但安装的电脑上有没有,此时我们把mysql数据库的安装包和执行安装的脚本打包进项目,让脚本替我们在这个时候去复制移动,去执行就可以了。

还是举个例子:

function OnMoved() STRING szMySqlBatPath, szConfigXmlPath,szMyFontPath, szMyFontBatPath, szMyAppFontPath, szResult, szMyDatabaseBatPath; NUMBER nNeutrValue;
begin      if( !MAINTENANCE ) then// copy MySQL57 to C:szMySqlBatPath = APPINSTALLDIR + "\\" + szCopySQLScriPath;LaunchAppAndWait(szMySqlBatPath, "", LAAW_OPTION_WAIT | LAAW_OPTION_HIDDEN); 	 endif;          end;
2.1 OnGeneratingMSIScript

在Action(动作) :LauchConditions之前执行;

2.2 OnGeneratedMSIScript

在Action(动作) LauchConditions之后执行;

2.3 OnInstallFilesActionBefore

在Action(动作) InstallFiles之前执行;

2.4 OnInstallFilesActionAfter

在Action(动作) InstallFiles之后执行;

2.5 OnMoving

在Action(动作) InstallInitialize之后执行;

2.6 OnMoved

在Action(动作) GeneratedMSIScript之前执行;

3. After Move Data(安装数据后)

3.1 OnFirstUIAfter

在第一次安装时,在复制安装数据之后触发的事件,例如有一个系统需要将安装路径设置FTP虚拟目录,如果在安装数据之前就设置的话,该路径不存在,无法设置成功,因此需要在这个事件中设置。

function OnFirstUIAfter()STRING szTitle, szMsg1, szMsg2, szOpt1, szOpt2;NUMBER bOpt1, bOpt2;
beginDisable(STATUSEX);bOpt1   = FALSE;bOpt2   = FALSE;    if ( BATCH_INSTALL ) thenSdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );elseSdFinish ( szTitle , szMsg1 , szMsg2 , szOpt1 , szOpt2 , bOpt1 , bOpt2 );endif; end;
3.2 OnMaintUIAfter

在修改或卸载时,在修改或卸载数据之后触发的事件;这个时候比如确认执行卸载后,我们就可以清除软件安装目录信息:

function OnMaintUIAfter()STRING szTitle, szMsg1, szMsg2, szOpt1, szOpt2, szAPPInstallDir;NUMBER bOpt1, bOpt2, nBufferSize;
beginDisable(STATUSEX);if( REMOVEALLMODE ) then   szTitle = SdLoadString(IFX_SDFINISH_REMOVE_TITLE);szMsg1 = SdLoadString(IFX_SDFINISH_REMOVE_MSG1);    // Del AppPath  DeleteDir(APPINSTALLDIR, ALLCONTENTS);  elseszTitle = SdLoadString(IFX_SDFINISH_MAINT_TITLE);    szMsg1  = SdLoadString(IFX_SDFINISH_MAINT_MSG1);endif;bOpt1   = FALSE;bOpt2   = FALSE;    if ( BATCH_INSTALL ) thenSdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );else    SdFinish ( szTitle , szMsg1 , szMsg2 , szOpt1 , szOpt2 , bOpt1 , bOpt2 );endif;
end;
3.3 OnEnd

这个就是在软件安装后来进行触发的时间(在点击“完成”按钮之后触发),比如利用脚本方式创建数据库,即可以在这部分进行完成:

function OnEnd()STRING szMySqlBatPath, szResumeConfigPath, szResult, szConfigAppPath, szPreAPPInstallDir; NUMBER nBufferSize;
begin if ( MAINTENANCE ) then// Resume Config Files   // Look up Preinstall Path  nBufferSize = 1024;  MsiGetProductInfo(PRODUCT_GUID, INSTALLPROPERTY_INSTALLLOCATION, szPreAPPInstallDir, nBufferSize);szResumeConfigPath = szPreAPPInstallDir ^ szApplicationName + "\\" + szResumeScriPath;LaunchAppAndWait(szResumeConfigPath, "", LAAW_OPTION_WAIT | LAAW_OPTION_HIDDEN);  else    // Totol Install Execute Sql Script mysql-intit.batszMySqlBatPath = szMySqlPath + "\\" + szProgram;LaunchAppAndWait(szMySqlBatPath, "", LAAW_OPTION_WAIT | LAAW_OPTION_HIDDEN);     // Run db_install_startup.bat      if FindFile(APPINSTALLDIR , szInitDatabasePath, szResult) = 0 thenszMyDatabaseBatPath = APPINSTALLDIR + "\\" + szInitDatabasePath;LaunchAppAndWait(szMyDatabaseBatPath, "", LAAW_OPTION_HIDDEN); endif;	 endif;end; 

二、Installshield打包过程中的问题

1. 错误6003

这个错误可能是因为项目的一些必要的包没有下载,需要重新下载即可

2. 错误1014

这个问题比较好解决一些,一般来讲,在你进行build的时候,不要打开需要打包的文件夹中的某个文件,被占用则会报这个错误(build的时候不要打开Setup.exe所在的文件夹)

3. 错误7132

出现这个问题的原因,则有可能是:

  • 当构建具有以下两个元素的基本MSI项目时,可能会发生此错误:
    – 版本的Build选项卡下的UI Languages设置包含了不支持的语言InstallScript
    – 该项目包含一个InstallScript类型的Custom Action

三、可能用到的bat复制执行脚本

1. 复制文件到指定路径

::被复制的文件夹
set tarDir=
::文件名
set filename=db_install_startup.bat::判断文件夹是否存在
if not exist %tarDir% {::创建目录mkdir %tarDir%
}::复制文件,并重定向输出
copy %filename% %tarDir%%filename% > nul::判断是否执行成功
if "%errorlevel%"=="0" {echo Copy successfully
} else {echo Copy failed
}

其实用XCopyFile进行文件夹拷贝只需要一句话:
nResult = XCopyFile("C:...//SrcDir//*.*","C:...//TargetDir//*.*",COMP_NORMAL);

2. 利用脚本安装下载的字体

@echo off
::字体所在完整路径
set "zt=D:\SourceHanSansSC-Regular.ttc"
::安装字体
mshta "javascript:new ActiveXObject('Shell.Application').NameSpace(20).CopyHere('%zt:\=\\%',0x0010);close()"
pause

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端代理配置

dev: {env: require(./dev.env),port: process.env.PORT || 8080,autoOpenBrowser: true,assetsSubDirectory: static,assetsPublicPath: /,proxyTable: {// 以 /party/fundamental/ 开头的请求,全部转发到 target 设置的地址/party/fundamental/: {// target: http…

【BASH】回顾与知识点梳理(二十八)

【BASH】回顾与知识点梳理 二十八 二十八. 例行性工作排程(crontab)28.1 什么是例行性工作排程Linux 工作排程的种类: at, cronCentOS Linux 系统上常见的例行性工作 28.2 仅执行一次的工作排程atd 的启动at 的运作方式实际运作单一工作排程at 工作的管理batch&…

Windows下升级jdk1.8小版本

1.首先下载要升级jdk最新版本,下载地址:Java Downloads | Oracle 中国 2.下载完毕之后,直接双击下载完毕后的文件,进行安装。 3.安装完毕后,调整环境变量至新安装的jdk位置 4.此时,idea启动项目有可能会出…

ATF bl1 ufshc_dme_get/set处理流程分析

ATF bl1 ufshc_dme_get/set处理流程分析 UFS术语缩略词1 ATF的下载链接2 ATF BL1 ufshc_dme_get/set流程3 ufs总体架构图3.1 UFS Top Level Architecture3.2 UFS System Model 4 ufshc_dme_get/set函数接口详细分析4.1 ufshc_dme_get4.2 ufshc_dme_set4.3 ufshc_send_uic_cmd4.…

nodejs+vue+elementui考研互助交流网站

语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 前端nodejsvueelementui,该系统采用vue技术和B/S结构进行开发设计,后台使用MySQL数据库进行数据存储。系统主要分为两大模…

大数据课程J2——Scala的基础语法和函数

文章作者邮箱:yugongshiyesina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Scala的基础语法; ⚪ 掌握Scala的函数库; 一、Scala 基础语法一 1. 概述 语句 说明 示例 var 用来声明一个变量, 变量声明后…

java面试题(16):Mysql一致性视图是啥时候建立的

1 演示错误案例 先给大家来一个错误演示。 我们打开两个会话窗口,默认情况下隔离级别是可重复读,我们来看下: 首先在 A 会话中查看当前 user 表,查看完成后开启事务: 可以看到id3的数据sex是男。 接下来在 B 会话中…

K8S系列一:概念入门

写在前面 本文组织方式: K8S的架构、作用和目的。需要首先对K8S整体有所了解。 K8S是什么? 为什么是K8S? K8S怎么做? K8S的重要概念,即K8S的API对象。要学习和使用K8S必须知道和掌握的几个对象。 Pod 实例 Volume 数…

php错误类型与处理

1 语法编译错误,少了分号,这是系统触发的错误,不需要我们去管。 2 错误类型有四种:error致命错误,代码不会往下运行;warning:提醒错误,会往下运行,但是会有意想不到的结果…

【C++学习】STL容器——stack和queue

目录 一、stack的介绍和使用 1.1 stack的介绍 1.2 stack的使用 1.3 stack的模拟实现 二、queue的介绍和使用 2.1 queue的介绍 2.2 queue的使用 2.3 queue的模拟实现 三、priority_queue的介绍和使用 3.1 priority_queue的介绍和使用 3.2 priority_queue的使用 3.4 p…

JVM---理解jvm之对象已死怎么判断?

目录 引用计数算法 什么是引用 可达性分析算法(用的最多的) 引用计数算法 定义:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一&#xff1…

国内外医疗器械政策法规网站集合

随着医疗技术的不断发展,医疗器械在现代医疗中扮演着重要的角色。为了确保医疗器械的安全性、有效性和质量,各国纷纷制定了一系列的政策法规来监管医疗器械的研发、生产、销售和使用。这些政策法规的制定和实施对于保障公众健康、促进医疗器械产业的健康…

docker--------介绍、常用命令,国内源配置

1 docker 国内源配置 # 镜像:一堆文件 -目前从远程仓库下载的:https://hub.docker.com/ -镜像有很多人提供:官方提供,第三方提供 -镜像--》更新--》Tag不同版本 -centos:latest 最新 -docker pull 能找到…

旧版本docker未及时更新,导致更新/etc/docker/daemon.json配置文件出现docker重启失败

一、背景 安装完docker和containerd之后,尝试重启docker的时候,报错如下: systemctl restart dockerJob for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “…

学习ts(一)数据类型(基础类型和任意类型)

运行 起步安装 npm install typescript -g 运行tsc index.ts生成对应的js文件,然后使用node index.js执行js文件 为了方便运行还可以安装插件,ts-node index.ts运行即可 npm i ts-node -g npm init -y npm i types/node -D基本数据类型 // 1.字符…

探索不同类型的代理服务器 (代理 IP、socks5 代理)及其在网络安全与爬虫中的应用

1. 代理服务器简介 代理服务器是一台充当中间人的服务器,它在客户端与目标服务器之间传递网络请求。代理服务器在不同层级上可以执行不同的任务,包括缓存、过滤、负载均衡和隐藏客户端真实IP地址等。在网络安全和爬虫领域,代理服务器具有重要…

ARM(汇编指令)

.global _start _start:/*mov r0,#0x5mov r1,#0x6 bl LoopLoop:cmp r0,r1beq stopsubhi r0,r0,r1subcc r1,r1,r0mov pc,lr*/ mov r0,#0x1mov r1,#0x0mov r2,#0x64bl Loop Loop:cmp r0,r2bhi stopadd r1,r1,r0add r0,r0,#0x01mov pc,lr stop:B stop.end

现有的vue3+ts+vite项目集成electron

效果图 什么时Electron Electron是使用JavaScript,HTML和CSS构建跨平台的桌面应用程序框架。 Electron兼容Mac、Windows和Linux,可以构建出三个平台的应用程序。 现有的vue3项目集成Electron 安装依赖 原来有一个vue3+ts+vite+pnpm的项目,其中sub-modules是子项目,web是…

Monge矩阵

Monge矩阵 对一个m*n的实数矩阵A&#xff0c;如果对所有i&#xff0c;j&#xff0c;k和l&#xff0c;1≤ i<k ≤ m和1≤ j<l ≤ n&#xff0c;有 A[i,j]A[k,l] ≤ A[i,l]A[k,j] 那么&#xff0c;此矩阵A为Monge矩阵。 换句话说&#xff0c;每当我们从矩阵中挑…

全面梳理Python下的NLP 库

一、说明 Python 对自然语言处理库有丰富的支持。从文本处理、标记化文本并确定其引理开始&#xff0c;到句法分析、解析文本并分配句法角色&#xff0c;再到语义处理&#xff0c;例如识别命名实体、情感分析和文档分类&#xff0c;一切都由至少一个库提供。那么&#xff0c;你…