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;