InstallShield 工程类型installscript,如何覆盖安装?

 1、  开始使用的msi工程类型。网上找了资料, 在kevin的博客里找到这条方法 可以通过删除Execute Sequence中的RegisterProduct和PublishProduct两个CA实现同样的需求

试过之后确实是可以 重复安装的,但是 执行开始菜单中的卸载是无法卸载的执行有下图的 错误:

问过人也找过资料 说将它的属性Arguments、Target 分别设为:/x [ProductCode]、 [SystemFolder]msiexec.exe

即可卸载,但不知道为什么我们的产品 GUID没变过,执行卸载的时候,提示 不是一个产品。如下图

 而控制面板是不能显示该程序的。所以此方法不可行。

 

2、  换了个工程类型,使用 installscript工程类型,此类型的 脚本中 advanced下面有个 OnShowUI(msi没有这个方法,即存放的检测是已安装、更新、还是第一次安装 的脚本,修改逻辑

如果是第一次安装执行OnFirstUIbefore() ;(不必修改)

如果是更新执行 OnUpdateUIBefore();(不必修改)

如果是已经安装 默认是执行的OnMaintUIBefore(); 则修改为 继续执行 OnFirstUIbefore();

此时调试 覆盖安装会覆盖不了文件。调用一个修复方法FeatureReinstall(); 就可以 覆盖文件了 

在 卸载的快捷方式中添加一个参数 -removeonly,检测判断此参数为卸载功能,即 开始菜单的卸载可以正常卸载。

 

注意:这里如果不加这个参数执行卸载也是覆盖安装

 

OnShowUI() 修改代码如下: 

 

function OnShowUI()
BOOL    bMaintenanceMode, bUpdateMode;
string    szIgnore, szTitle;
begin        
        // Enable dialog caching
        Enable( DIALOGCACHE );
        
        // Determine what events to show.
        bUpdateMode    = FALSE;
        bMaintenanceMode = FALSE;
    
        // Remove this to disabled update mode.
        if( UPDATEMODE ) then
            bUpdateMode = TRUE;
        endif;

        // Remove this to disable maintenance mode.
        if ( MAINTENANCE ) then
            bMaintenanceMode = TRUE;          
        endif;

        // Show appropriate UI       
        if( REMOVEONLY )   then   
            //    MessageBox ("卸载", SEVERE);
                OnMaintUIBefore(); 
        else               
            if( bUpdateMode ) then   
             //    MessageBox ("更新", SEVERE);
                OnUpdateUIBefore();
             else  
                 if ( bMaintenanceMode ) then  
                     
                    if( MessageBox( "您已安装最新版本,是否覆盖安装?" , MB_YESNO ) != IDYES ) then
                        abort;
                    endif;                        
                    OnFirstUIBefore();     
                    FeatureReinstall(); 
                else
                //    MessageBox ("第一次安装", SEVERE);                   
                    OnFirstUIBefore(); 
                endif;
             endif; 
        endif;

        // Move Data
        OnMoveData(); 
        
        //OnFirstUIAfter();  
        if( REMOVEONLY )   then
                OnMaintUIAfter();
        else            
                OnFirstUIAfter();            
        endif;

        // Disable dialog caching
        Disable(DIALOGCACHE);

end;

 

转载于:https://www.cnblogs.com/daocaorenbx/p/3305162.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值