您的位置:首页 > 其它

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

2013-09-06 11:44 411 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐