installshield学习笔记1Word文档格式.docx

上传人:b****4 文档编号:16989189 上传时间:2022-11-27 格式:DOCX 页数:26 大小:825.95KB
下载 相关 举报
installshield学习笔记1Word文档格式.docx_第1页
第1页 / 共26页
installshield学习笔记1Word文档格式.docx_第2页
第2页 / 共26页
installshield学习笔记1Word文档格式.docx_第3页
第3页 / 共26页
installshield学习笔记1Word文档格式.docx_第4页
第4页 / 共26页
installshield学习笔记1Word文档格式.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

installshield学习笔记1Word文档格式.docx

《installshield学习笔记1Word文档格式.docx》由会员分享,可在线阅读,更多相关《installshield学习笔记1Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。

installshield学习笔记1Word文档格式.docx

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"

(1.掌管安装语言类型,2新版本安装也会检测此值)

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\InstallShield_{4C99CDB5-D525-4FB2-8BF0-1C7CDCA077BF}"

判断是否安装;

1."

2."

至更改2后:

(控制面板可卸载)

1.本安装包再次安装,会安装Products自动选择安装语言

2.新安装包则会查找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("

存在同名虚似目录"

WARN

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1