2012-01-25 43 views
1

我为我的产品定位了Windows XP及更高版本,并使用Windows安装程序(WI)进行安装。生成的.msi文件有一个产品代码,比如PC1(实际上是一个guid)和一个升级代码UC1(也是一个guid)。一段时间后,我为我的产品的更新版本创建了一个新的设置。新的.msi文件有一个新的产品代码PC2和相同的升级代码UC1(也称为主要升级)。我的公司希望使用我们自己的安装程序安装.msi文件。为此,我们基本上使用MsiInstallProduct来安装.msi文件,而整个UI在我们自己的安装程序中(并且我们使用MsiSetExternalUI来请求WI向我们发送通知)。那我遇到的问题如下:使用MsiSetExternalUI时添加/删除程序控制面板中的重复条目

  • 如果两个版本的产品的安装使用“MSIEXEC/I myapp.msi”,那么只会有一个条目中的“添加在同一台机器上“程序和功能”控制面板小程序中的“/删除程序”。换句话说,在安装新版本时,旧版本会被卸载。

  • 如果两个版本使用MsiInstallProduct以编程方式安装在同一台机器上,则控制面板中将有两个不同的条目。

再次,只有当我试图以编程方式安装(使用MsiOpenPackage + MsiDoAction或MsiInstallProduct),升级不会发生,我结束了在控制面板中的两个项目。我还发现,如果在调用MsiInstallProduct或MsiDoAction之前未使用MsiSetExternalUI设置外部UI回调,则新安装的升级部分也可按预期工作,CP中不会出现重复条目​​。

,我使用的MsiSetExternalUI回调是基本相同的一个MSDN文章中: http://msdn.microsoft.com/en-us/library/windows/desktop/aa368786(v=vs.85).aspx

我能做些什么(或者什么,我需要在我的回调处理),以避免重复/多控制面板中的条目?

感谢和问候,
利文特

+0

如果您在失败的方案中记录安装程序,FindRelatedProducts会报告什么内容?你的ALLUSERS礼服又是什么? (例如,Per User安装不能主要升级Per Machine安装。) –

+0

我以管理员用户身份运行。该产品是为所有人安装的。 ALLUSERS = 2,但我没有手动设置。通知INSTALLMESSAGE_ACTIONSTART和INSTALLMESSAGE_INFO我只能通过返回IDOK来处理。 – Levy

+0

我在日志中得到这个:.... INSTALLMESSAGE_INFO:Action start 3:40:02:FindRelatedProducts。
INSTALLMESSAGE_ACTIONDATA:找到的应用程序:{85144A07-AECF-4842-A9C4-9EBAFED473B7} – Levy

回答

0

回复我们的上述评论,我做了谷歌搜索CLIENTUILEVEL和前几名的命中表明,我认为CLIENTUILEVEL具有空值是正常的,REMOVE = ALL IS加工。这些注释表明要在日志中稍微深入一些并找出卸载(删除现有产品)失败的原因。如果你可以给我发一个完整的日志文件([email protected]),我可以帮你看看。

RemoveExistingProduct standard action

Link to article describing how to interpret Windows Installer log files(见注释)

RemoveExistingProducts running but not uninstalling Options

0

我遇到了我的ManagedMsiExec样本项目相同的行为:http://blogs.msdn.com/b/delay/archive/2012/01/09/make-things-as-simple-as-possible-but-not-simpler-managedmsiexec-sample-app-shows-how-to-use-the-windows-installer-api-from-managed-code.aspx

改变我的应用程序的记录行为没有帮助我的情况。但是在独立地注意到日志中相同的“CLIENTUILEVEL = REMOVE = ALL”奇怪之后,我发现了一个解决方法,它在调用MsiDoAction之前显式调用MsiSetProperty并将CLIENTUILEVEL设置为0。

在我看来,这似乎是Windows Installer本身的错误(在RemoveExistingProducts期间错误地设置CLIENTUILEVEL),但也许还有其他事情我不明白。无论如何,我已经取得了这一改变的成功,也许其他人也可以。 :)

相关问题