解决过的installshield问题汇总
经过这两三年的学习,我将总结过的问题都汇总一下。记录我的成长
1. 如何调用bat文件?
A: 在Installation Designer -> Behavior and Logic -> InstallScript ->Setup.rul里使用LaunchAppAndWait或者LaunchApp函数。
2. 如何修改“添加或删除程序”里我的软件的卸载图标?
A: Project Assisant -> Application Information,Select the icon to display your application in Add or Remove Program这项,点击Browse选择你想要的图标即可。
3. 如何在InstallScript脚本中完成DLL, OCX的注册
A:
在事件响应函数OnEnd中添加如下代码段:
function OnEnd()
string szDLL, szReg, szCmd;
begin
szReg = WINSYSDIR ^ "regsvr32.exe";
szDLL = TARGETDIR ^ "MYDLL.dll"; //如果是MSI工程,可以用INSTALLDIR代替TARGETDIR
szCmd = "/s \"" + szDLL + "\""; //增加静默参数s, 增加 \” 防止目录路径含空格的情况。
if (!REMOVEONLY) then
LaunchAppAndWait(szReg, szCmd, WAIT);
endif;
end;
结论:IS自带的DLL自注册不好使,这个示例少了的OnMaintUIAfter里反注册DLL的代码,不过写法基本相同,就是LaunchAppAndWait(szReg, szCmd, WAIT); 写成反注册就可以了
卸载时反注册只要在命令参数中再多加一个 /u卸载应该放到OnMaintUIBefore,如果放到OnMaintUIAfter,反注册会失败,因为到这一步文件已经被删除,再进行反注册肯定会失败。
相关链接:http://www.cnblogs.com/installshield/archive/2010/09/26/1835404.html
4. 问题描述:Installshield判断操作系统是否为64位,并且为操作注册表进行设置 IS脚本操作注册表在64位平台下必须有特殊的设置
解决方法:编写代码
if (SYSINFO.bIsWow64) then //如果为64位操作系统
REGDB_OPTIONS = REGDB_OPTION_WOW64_64KEY ; //则为注册表操作进行64位特殊设置
endif;
/**底下照常操作注册表即可*/
5.
问题:驱动反安装问题解决汇总
解决方法:
1. 现在可以确定反安装是installshield11中已经自己带了
2. 按照打包程序中的顺序制作安装运行包,就完全可以实现安装反安装功能,无需在程序中再进行编写
3. SetTitle( @IFX_SETUP_TITLE_CAPTIONBAR, 0, BACKGROUNDCAPTION );在编译时不会出现问题,但是安装时出现注册表中没有IFX_TITLE_CAPTIONBAR。解决方法是去注册表中看相应的是什么最后更改为SetTitle(@IFX_TITLE_CAPTIONBAR,0, BACKGROUNDCAPTION );
6.
问题:解决卸载时残留目标文件夹的问题
解决方法:在 uninstalled函数最后加DeleteProgramFolder ( TARGETDIR )
7.
问题:改变那三个安装类型(典型,压缩,定制)的文字,如:典型,完全,定制
解决方法:
1. InstallScript MSI中安装类型默认走的是SetupType2 这个界面,这个只有两种类型
2. SetupType 这个界面,这个只有三种类型,
3. 要想有三种类型,则在脚本中进行setuptype的修改
4. 改直接在dialog中进行对应界面的修改
8.
问题描述:如何动态链接文件夹可以使文件夹不在根目录下
解决方法:可以在Component下的Destination中<TAGETDIR>默认是这样的,可以加上“\所要加的文件夹的名字”例如“<TAGETDIR>\DemoApp”
9.
针对无法替换的文件处理方法
问题***.xml无法进行替换
解决方法:安装前先把这个文件进行删除,重新进行安装此文件
代码:在OnFirstUIBefore中进行添加下面文件
szOldPath = TARGETDIR;
TARGETDIR = szOldPath + "\\***";
if (FindFile(TARGETDIR, "***.xml", svResult) == 0) then
Delay(1);
DeleteFile("***.xml");
TARGETDIR = szOldPath;
endif;
Dlg_Start:
10.
编写脚本实现判断是否安装framwork,没有安装则安装
问题描述:安装产品前实现,判断是否安装framwork,没有安装则安装。也就是检测系统中是否安装
解决代码:
1.support files下面language independent下面放文件dotNetFx40_Full_x86_x64.exe
2.RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );
szKeyRoot = "SOFTWARE\\Microsoft\\.NETFramework\\v4.0.30319";
if (RegDBKeyExist (szKeyRoot) < 0) then
MessageBox ("本机没安装.NetFrameWork4.0,请先安装.NetFrameWork4.0软件包", SEVERE);
LaunchAppAndWait( SUPPORTDIR ^ "dotNetFx40_Full_x86_x64.exe" , "", LAAW_OPTION_WAIT);
//SdShowMsg("正在检测 Microsoft DotNet Framework...",FALSE);
//abort;
endif ;
11.
SUPPORTDIR 路径解释
问题描述:代码中出现SUPPORTDIR ,SRCDISK
SUPPORTDIR说明是临时所放文件的地址。SRCDISK安装盘所在的盘符根目录下面
SUPPORTDIR位置是support files下面language independent下面放的exe或者dll等文件
SRCDISK位置是,光盘的目录。如果是复制的放在d盘下面,则代表d:
SRCDIR也是安装包的路径
TARGETDIR目标文件夹路径
12.
安装途中点击取消的时候会出现界面停止,界面卡死问题解决方法
问题:界面为什么会卡死
解决:问题的原因是增加这个函数导致的SdShowMsg,这个函数在install11中出现这样的bug
例如
SdShowMsg("正在检测 Microsoft DotNet Framework...",TRUE);
Delay(2);
RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );
szKeyRoot = "SOFTWARE\\Microsoft\\.NETFramework\\v4.0.30319";
if (RegDBKeyExist (szKeyRoot) < 0) then
MessageBox ("本机没安装.NetFrameWork4.0,请先安装.NetFrameWork4.0软件包", SEVERE);
SdShowMsg("正在检测 Microsoft DotNet Framework...",FALSE);
abort;
endif ;
解决是去掉两个函数SdShowMsg就没事
13.
安装卸载界面固定卸载图标
问题:如题
解决办法:
generall information——add or remove programs——display icon添加图标即可
14.
如何增加安装路径的检查
问题:增加安装路径的检查,比如之前安装过server包,然后安装admin包,默认的安装路径应该是server安装路径,是判断安装过server。没有安装则按照原来的方式安装
实现:代码编写实现
function OnFirstUIBefore()
增加代码
//记忆安装server
nRootKey = HKEY_LOCAL_MACHINE;
szKey = "Software\\*****\\***";
if (RegDBSetDefaultRoot(nRootKey) >= 0) then
if(RegDBKeyExist (szKey) >= 0 ) then
szNumName = "InstallDir";
if (RegDBGetKeyValueEx(szKey, szNumName, nvType,szNumValue,nvSize) >= 0) then
szDir = szNumValue ;
else
//没有安装则按照原来的方式安装
szDir = TARGETDIR;
endif;
else
szDir = TARGETDIR;
endif;
else
szDir = TARGETDIR;
endif;
nSetupType = COMPLETE;
TARGETDIR = szDir;
svDir = TARGETDIR;
szName = "";
szCompany = "";
bLicenseAccepted = FALSE;
修改代码
Dlg_SdAskDestPath:
szTitle = "";
szMsg = "";
nResult = SdAskDestPath( szTitle, szMsg, svDir, 0 );
TARGETDIR = svDir;
if (nResult = BACK) goto Dlg_SdRegisterUser;
15.
定制安装包如何实现安装包选择定制安装,安装所要的部分如何实现
1.安装包的实现
将安装包分成不同的部分,放入不同的组件
2.桌面图标和开始菜单的图标的实现
Component选择相应的安装包,Woeking Directory指向相应的安装包<TARGETDIR>\Admin,Hot Key改为0,
开始菜单除上面的做法,还需将快捷方式的类型
从ID_STRING37更改为IDS_SHORTCUT_DISPLAY_NAME16
安装脚本实现:
Dlg_SetupType:
szTitle = "";
szMsg = "";
nResult = SetupType2(szTitle, szMsg, "", nSetupType, 0);
if (nResult = BACK) then
goto Dlg_SdAskDestPath;
else
nSetupType = nResult;
if (nSetupType != CUSTOM) then
nvSize = 0;
FeatureCompareSizeRequired(MEDIA, TARGETDIR, nvSize);
if (nvSize != 0) then
MessageBox(szSdStr_NotEnoughSpace, WARNING);
goto Dlg_SetupType;
endif;
bCustom = FALSE;
goto Dlg_SdFeatureTree;
else
bCustom = TRUE;
endif;
endif;
Dlg_SdFeatureTree:
if ((nResult = BACK) && (nSetupType != CUSTOM)) goto Dlg_SetupType;
szTitle = "";
szMsg = "";
szTargetdir = TARGETDIR;
szFeatures = "";
nLevel = 2;
if (nSetupType = CUSTOM) then
//{{IS_SCRIPT_TAG(Dlg_SdFeatureTree)
nResult = SdFeatureTree( szTitle, szMsg, szTargetdir, szFeatures, nLevel );
//}}IS_SCRIPT_TAG(Dlg_SdFeatureTree)
if (nResult = BACK) goto Dlg_SetupType;
endif;
/*Dlg_SQLServer:
nResult = OnSQLServerInitialize( nResult );
if( nResult = BACK ) goto Dlg_SdFeatureTree;
Dlg_ObjDialogs:
nResult = ShowObjWizardPages( nResult );
if (nResult = BACK) goto Dlg_SQLServer; */
Dlg_SdStartCopy2:
szTitle = "";
szMsg = "";
//{{IS_SCRIPT_TAG(Dlg_SdStartCopy2)
nResult = SdStartCopy2( szTitle, szMsg );
//}}IS_SCRIPT_TAG(Dlg_SdStartCopy2)
if (nResult = BACK) goto Dlg_SetupType;
// Added in 11.0 - Set appropriate StatusEx static text.
SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );
return 0;
end;
16.
问题:通过开发模式安装,多组件以及数据层补丁打不上的问题。其实涉及到路径中途修改
解决如下:
首先查找问题所在,看选择开发模式的代码与其它两种模式的代码有什么区别。先看代码就是增加界面其它没什么区别,所以开始怀疑是不是静默安装不支持多种模式,一种模式生成的setup.iss只能一种模式安装,最后发现演示和正版模式都没有问题生成是setup.iss文件都是一样的信息,排除这个问题。开始一段代码一段代码的查找问题,一只以为在安装文件之前有问题,最后查找到安装完后注册时候出现的问题。通过flag==4执行的代码有问题。等于4将SRCDIR路径进行改变。所以需要提前保存之前的路径之后重新赋值即可
代码实现如下:
function OnFirstUIAfter()
STRING szTitle, szMsg1, szMsg2, szOption1, szOption2,szPath1,szPath2;
NUMBER bOpt1, bOpt2;
STRING path,svResult,szOldPath,szProgram,szPath,szCmdLine;
string szKeyName,szCMD,szCMD1;
NUMBER nResult, nvType, nvSize;
STRING szSysPath, szBinPath;
begin
Disable(STATUSEX);
path= SRCDIR; //保存之前的路径
//软授权文件拷贝
if (FLAG==4) then
szPath1 = SUPPORTDIR;
szPath2 = TARGETDIR ;
SRCDIR= szPath1 ;
TARGETDIR= szPath2 ;
if( CopyFile("DevTryout.reg", "DevTryout.reg")< 0 ) then
MessageBox("软授权注册失败!", SEVERE);
else
TARGETDIR= szPath1;
DeleteFile("DevTryout.reg" );
endif;
TARGETDIR= szPath2 ;
SRCDIR=path ;//将之前路径重新赋值
endif;
总结:也许我用install的次数不多,基本上都是没有变化的打包。只是在遇到问题的时候才会寻找解决办法。将之前解决过的问题整理一下这样以后学习就方便多了。
浙公网安备 33010602011771号