installshield学习笔记Word文档下载推荐.docx
- 文档编号:17419321
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:26
- 大小:825.17KB
installshield学习笔记Word文档下载推荐.docx
《installshield学习笔记Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《installshield学习笔记Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
InstallNet在开始定义BOOL类型
修改OnFirstUIAfter中的脚本
以判断是否重启。
vbs控制IIS
直接使用IIS自带的脚本来做的.基本上IIS的所有操作都可以用这个脚本完成.目录在C:
\inetpub\AdminScripts
管理安装服务器角色
参数名称:
修改IIS中ISAPI和CGI限制
%windir%\\system32\\inetsrv\\setconfig/section:
isapiCgiRestriction/[path='
C:
\Windows\\Framework\'
].allowed:
True
控制文本框
自定义界面,如果控制文本框
此时,当选择文本框时,便可取消其它选项的状态。
多语言安装
不同语言的安装文件放到不同的Components里,然后设置相应的安装语言条件即可
获取安装环境语言
获取Version信息
读取ProductVersionProperty
Installshield获取安装包版本的系统变量为IFX_PRODUCT_VERSION
打开对话框的时候按某个路径打开
打开某一个路径的文件夹用这个函数ShowProgramFolder(szFolder,nCommand);
判断服务状态
ServiceGetServiceState
Installshield环境变量的追加与删除
======环境变量的追加与删除======
======环境变量的添加或追加======
*问题:
如何能在安装包中添加环境变量,而不用用户手动在我的电脑/属性/高级/环境变量中设置,特别是,如何能判断已有的环境变量,如Path,在不改变已有的环境变量的内容的基础上,进行追加呢
*解决方案:
添加环境变量时,可以通过注册表中相应位置写键值的方式完成:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\SessionManager\Environment.
首先判断Path是否存在,如果不存在,创建,如果存在,已有的内容进行追加。
追加的方法参考如下代码:
functionAddPath()
NUMBERnResult,nType,nSize,nvSize,nvType;
STRINGstrResult,szkey,szNumName,szNumValue,nRootKey,szPath,szPath2;
STRINGTITLE,szFormat;
begin
szkey="
SYSTEM\\ControlSet001\\Control\\SessionManager\\Environment"
;
SEVERE);
returnFALSE;
abort;
PathGet(szPath);
Disable(LOGGING);
if(RegDBSetKeyValueEx(szkey,"
Path"
REGDB_STRING,szPath,-1)<
0)then
MessageBox("
RegDBSetKeyValueExfailed."
Enable(LOGGING);
else
szPath=TARGETDIR^"
\\scratch\\bin"
0)then
end;
======卸载时如何删除追加的环境变量的问题======
安装包卸载时,如何能不改变已有的环境变量的内容,只是删除追加的环境变量
参考如下,特有的关键字删除即可,案参考以下代码片段,即可实现。
functionDelPath()
."
MSU文件安装
if(FeatureIsItemSelected(MEDIA,szMediaServer)=1)then
ifthen
LaunchAppAndWait("
TARGETDIR+"
MediaServer\\"
LAAW_OPTION_WAIT);
LaunchAppAndWait
获取执行返回值
Uac
安装后
安装重启后继续安装
很多朋友做安装包的时候,所打包的软件需要.NETFramework之类的环境,他们会检测系统是否已经安装了.NET,如果没有,则调用.NET安装包来安装。
但是.NET安装完是需要重启动的,一般来说,我们都推荐使用/q/norestart的静默安装函数来使重启动推迟到安装结束时,使用如下:
LaunchAppAndWait(SUPPORTDIR^"
/q/norestart"
WAIT);
.NET在重启后才能生效,但是如果在安装完.NET之后的安装行为中立刻需要使用.NET特性,那么必须让先电脑重新启动,但是重启后让用户再次点击来继续安装是不友好的行为,如果能够在重启后自动调用安装包继续下一步安装,那该多么好啊。
因此我的想法是:
将的路径写入到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
键值下,这样会在你的电脑重启后,自动运行你的来继续安装。
记得在安装结束时,写脚本来删除这个键值,不然每次电脑开机都要运行这个啦
安装完毕调用重启界面
修改OnFirstUIAfter()函数里的脚本:
安装后刷新环境变量
#define
WM_WININICHANGE
0x001A
HWND_BROADCAST
0xffff
szEnv
=
Environment"
pEnv
&
szEnv;
SendMessage
(HWND_BROADCAST,
WM_WININICHANGE,
0,
卸载
自动编译、打包
版本机,SVN,融合起来,自动编译和打包容易了就。
TFS的没有弄过。
我们用的是SVN,将SVN、CruiseControl和Installshied整合在一起,每天检查更新、自动集成、编译,然后打包
C#自动编译com
加
引用
然后
var
proj
new
();
(projPath);
version;
用前Regsvr32
/i
c#的项目
build
标签中
platForm
target
要选x86
错误处理
安装完成时提示1603错误
启动两个服务:
netstart\"
WebManagementService\"
LAAW_OPTION_WAIT|LAAW_OPTION_HIDDEN);
netstartaspnet_state"
LAAW_OPTION_WAIT|LAAW_OPTION_HIDDEN);
记录安装日志
适用工程
BasicMSI,InstallScriptMSI
操作系统
所有的Windows
摘要
要产生一个记录安装过程的日志文件,需要在命令行模式下用/l运行MSI包。
日志文件可被用来诊断安装失败或未定义行为的原因。
详述
要记录MSI安装包的运行过程,你需要使用/l(可伴随更多开关使用,见下表),同时也需要提供日志文件路径(注意必须为绝对路径)。
下面的例子表明如何产生一个日志文件以包含最详细的安装日志信息。
msiexec/i"
\mystuff\"
/l*v"
d:
\placeforlogs\"
下表是可以和/l一起使用的开关
ModifierDescription
i
Statusmessages-Indicateswhenactionsarestartedandstopped.
w
Non-fatalwarnings
e
Allerrormessages
a
Startupofactions
r
Action-specificrecords
u
Userrequests
c
InitialUIparameters
m
Out-of-memoryorfatalexitinformation
o
Out-of-disk-spacemessages
p
Terminalproperties
v
Verboseoutput
x
Extradebugginginformation--onlyavailableonWindowsServer2003
+
Appendtoexistingfile
!
Flusheachlinetothelog
*
Wildcard,logallinformationexceptforthevandxoptions.Toincludethevandxoptions,specify"
/l*vx"
.
其他示例
Keeptrackofthesequenceinwhichactionsstartandstopduringuninstallation:
msiexec/x{0000010001}/li"
\logdir\"
仅记录错误:
/le"
Logeventsthataremoreminuteinscopethantheactions并记录内存不足和磁盘空间错误:
msiexec/jm"
/lvmo"
再安装结束时获得一份所有属性和其值的列表,但是追加到中(而非替换之)
/lp+"
通过产生MSI运行日志
如果你无法直接访问MSI文件(比如只有单一的压缩的),你可以使用的/v开关来传递参数给msiexec。
值得注意的是日志记录只会MSI的运行记录,而不会记录来自本身的动作(以及或者本身的动作)。
注意点:
1.在/v和他的参数间不能有空格。
2.整个参数必须被引号包围。
3.参数中如果有引号,则需要使用用转义符\。
下面的例子表明如何使用产生一个日志文件以包含最详细的安装日志信息
/v"
/l*v\"
\placeforlogs\\"
注意工程文件去掉只读属性
卸载失败提示错误
在
改为YES即可
升级
安装解释
在InstallShield的高级培训课程中,我们常谈到的掌握MSI工程的四大核心内容,其中Condition就是其中之一。
今天我们对Condition再次做一个总结:
初次安装:
NotInstalled
修改,修复或删除:
Installed
删除(卸载):
REMOVE
维护或修复:
InstalledANDNotREMOVE
小版本升级:
IS_MINOR_UPGRADE
大版本升级:
IS_MAJOR_UPGRADE
上述适用于InstallShield的BasicMSI工程和InstallScriptMSI工程。
安装卸载旧版本(淘宝)
InstallShield安装新的打包程序时,默认会提示下面的对话框,大意是说已经安装了产品的另一个版本,要用户手动去卸载老版本,不是很友好。
下面是对InstallShield在安装新版本时自动卸载老版本的一些尝试,主要是InstallScript程序的编写。
1.首先要将InstallationDesigner–》Upgrades–》PrepareSetupForUpgradeScenarios–》UpgradeWindowsInstallerSetup–》common下的Small/MinorUpgradeSettings选择为Don’tpromptuser,justinstalltheupgrade。
这样不会出现上面的提示框,继续下面的卸载和安装。
2.下一步是要对OnResumeUI事件进行响应,主要是OnResumeUIBefore和OnResumeUIAfter。
3.在OnResumeUIBefore中完成老版本的卸载,脚本如下:
Usuallythishappensbyspecifying
Afterthisfunctionreturns,
xe"
ifnresult>
=0then
StrSub(szmsg1,szfilename,0,nresult+4);
StrSub(szmsg2,szfilename,nresult+4,200);
LongPathToQuote(szmsg1,FALSE);
LongPathToQuote(szmsg2,FALSE);
OnResumeUIAfter中完成新版本的安装,脚本如下:
Usuallythishappensbyspecifyingaproperty
Inthehandler,installationusuallydisplaysUIthatwill
TheDLL
ifUseDLL(WINSYSDIR^PSAPI_FILE)<
0then
MessageBox("
ERROR:
Couldnotload["
+WINSYSDIR^PSAPI_FILE+
]."
pvProcessIDs=ArrayToPointer(nvProcessIDs);
EnumProcesses(pvProcessIDs,512,nvBytesReturned);
EachprocessID
nvProcesses=nvBytesReturned/PROCESSID_LENGTH;
fornvIndex=1tonvProcesses
nvProcessHandle=OpenProcess(PROCESS_QUERY_INFORMATION|
PROCESS_VM_READ,0,nvProcessIDs(nvIndex));
ifnvProcessHandle!
=0then
ifEnumProcessModules(nvProcessHandle,nvModuleHandle,
PROCESSID_LENGTH,nvBytesRequired)!
ifGetModuleFileNameExA(nvProcessHandle,nvModuleHandle,
svModuleName,SizeOf(svModuleName))!
ifnvProcessIDs(nvIndex)=nvFindProcessIdthen
szFindModName=svModuleName;
bvRunning=TRUE;
gotoProcessRunningEnd;
ParsePath(svFileName,svModuleName,FILENAME_ONLY);
ifStrCompare(svFileName,szAppName)=0then
endfor;
ProcessRunningEnd:
ifUnUseDLL(PSAPI_FILE)<
Couldnotunload["
returnbvRunning;
程序的功能主要是枚举当前的进程Id,并通过Id匹配来得到Id对应的Modulename,本函数同样可以判断某个name的进程是否正在运行。
以上就是本人对用IS脚本完成安装新版本前卸载老版本的方法,如果大家有其他好的方法,请多多指教。
原文链接
自带更新升级问题汇总
1.当安装程序需要删除一些文件的时候,需要做MajorUpgrade,新安装之前必须卸载旧版本
文件升级必须更改版本号
注册表对应的反映
HKLM\SOFTWARE\Classes\Installer\Products\5BDC99C4525D2BF4B80FC1C7CD0A77FB"
掌管安装语言类型,2新版本安装也会检测此值)
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\InstallShield_{4C99CDB5-D525-4FB2-8BF0-1C7CDCA077BF}"
判断是否安装;
1."
2."
至更改2后:
(控制面板可卸载)
本安装包再次安装,会安装Products自动选择安装语言
新安装包则会查找Products项并提示已安装另一版本;
更改2与1后,任意版本安装都与初次安装一样(控制面板不可卸载)
学习链接
一个比较完整的案例
对IIS的使用有所讲解
InstallShieldx:
用脚本创建虚似目录、ISAPI筛选器、web服务扩展
1创建虚似目录
创建一个InstallScriptProject,展开“ServerConfiguration->
InternetInformationServices”,直观的点击右键创建新的虚似目录。
问题又出现了,当本机没有安装IIS的时候,安装包显示一个错误信息直接就退出了,帮主说要先检测本机有没有IIS,没有的话要跳出对话框让用户选择是继续安装还是退出安装。
被逼无奈,只能到处找资料把问题解决。
找到检测本机是否安装IIS的脚本,如下:
prototypeCheckIIS();
//监测系统是否安装了IIS
functionCheckIIS()
NUMBERnvType,nvSize;
STRINGsvvalue;
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
if(RegDBKeyExist("
System\\CurrentControlSet\\Services\\IISADMIN"
)=1)
then
return
(1);
else
return(0);
接下来就是要寻找如何用InstallScript创建虚似目录了,还是上次推荐的地方,有两篇配置IIS的文章又帮了我一个忙:
《InstallShield:
xzIISConfig用于配置IIS的InstallScript脚本》
《InstallShield:
更新了xzIISConfig配置脚本和xzSQLDeployTools》在二帮主的帮助下写出了创建虚似目录的脚本,如下:
setobjIIS_Root=CoGetObject("
"
if(IsObject(objIIS_Root))then
try
setobjVirtDir=("
IISWebVirtualDir"
VIRTUALDIR);
if(IsObject(objVirtDir))then
=VIRTUALDIRPATH;
=TRUE;
();
(TRUE);
catch
setobjVirtDir=CoGetObject("
+VIRTUALDIR,"
if(IsObject(objVirtDir))then
MessageBox("
存在同名虚似目录"
WARNING);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- installshield 学习 笔记