解决过的installshield问题汇总

经过这两三年的学习,我将总结过的问题都汇总一下。记录我的成长

1. 如何调用bat文件? 

A: Installation Designer -> Behavior and Logic -> InstallScript ->Setup.rul里使用LaunchAppAndWait或者LaunchApp函数。 

 

2. 如何修改添加或删除程序里我的软件的卸载图标? 

 

A: Project Assisant -> Application InformationSelect 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>\AdminHot 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执行的代码有问题。等于4SRCDIR路径进行改变。所以需要提前保存之前的路径之后重新赋值即可

 

代码实现如下:

 

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的次数不多,基本上都是没有变化的打包。只是在遇到问题的时候才会寻找解决办法。将之前解决过的问题整理一下这样以后学习就方便多了。

posted on 2013-07-22 14:24  分不清马铃薯淀粉  阅读(1563)  评论(0)    收藏  举报