2012-01-25 3 views
1

Windows XP以降を対象とする製品をWindowsインストーラ(WI)を使用してインストールするためのセットアップを作成しました。結果の.msiファイルには、製品コード、PC1(実際にはGUID)、アップグレードコードUC1(GUID)があります。しばらくすると、新しいバージョンの製品をインストールするための新しいセットアップが作成されました。新しい.msiファイルには、新しい製品コードPC2と同じアップグレードコードUC1(メジャーアップグレードとも呼ばれます)があります。私の会社は私たち自身のインストーラで.msiファイルをインストールしたいと思っています。そのためには、基本的にMsiInstallProductを使用して.msiファイルをインストールしますが、UI全体は独自のインストールプログラムに含まれています(MsiSetExternalUIを使用してWIに通知を送信するよう依頼しています)。私が午前問題は以下の通りです:MsiSetExternalUIを使用している場合、Add/RemoveProgramsコントロールパネルに重複した項目が表示される

  • 2は、製品のビルドならば「msiexecの/ I myapp.msi」だけで一つのエントリが存在します「追加使用して、同じマシンにインストールされています「プログラムと機能」のコントロールパネルアプレットの「プログラムの削除」をクリックします。つまり、新しいビルドのインストール中に、古いビルドがアンインストールされます。

  • MsiInstallProductを使用してプログラムで同じマシンに2つのビルドをインストールすると、コントロールパネルに2つの異なるエントリが表示されます。

もう一度、私は(MsiOpenPackage + MsiDoActionまたはMsiInstallProductのいずれかを使用して)プログラム的にそれをインストールしようとする場合にのみ、アップグレードは発生しませんし、私は、コントロールパネルの2つのエントリで終わります。また、MsiInstallProductまたはMsiDoActionを呼び出す前にMsiSetExternalUIを使用して外部UIコールバックを設定しないと、新しいインストールのアップグレード部分も期待通りに機能し、CPに重複エントリは存在しないことがわかりました。

私はMsiSetExternalUIに使用するコールバックは基本的には、このMSDNの記事のものと同じである: http://msdn.microsoft.com/en-us/library/windows/desktop/aa368786(v=vs.85).aspx

私は何ができるか(または私は私のコールバックで処理するために必要なもの)の重複/複数のを避けるためにコントロールパネルのエントリ?

おかげで、よろしく、
レベンテ上記の私たちのコメントを再

+0

失敗したシナリオでインストーラをログに記録すると、FindRelatedProductsは何を報告しますか?あなたのALLUSERSの習慣は何に設定されていますか? (たとえば、ユーザーごとのインストールでは、マシンごとのインストールを大規模にアップグレードすることはできません。) –

+0

管理ユーザーとして実行しています。製品はすべてのためにインストールされています。 ALLUSERS = 2ですが、私はこれを手動で設定しません。通知INSTALLMESSAGE_ACTIONSTARTとINSTALLMESSAGE_INFO私はIDOKを返すことによってのみ処理します。 – Levy

+0

これをログに記録します:.... INSTALLMESSAGE_INFO:アクション開始3:40:02:FindRelatedProducts。
INSTALLMESSAGE_ACTIONDATA:見つかったアプリケーション:{85144A07-AECF-4842-A9C4-9EBAFED473B7} – Levy

答えて

0

は、私がCLIENTUILEVELと最初のいくつかのヒットのためのGoogle検索はCLIENTUILEVELがnull値を持つことは正常であり、そのREMOVE = ALLであることを私に示しましたワーキング。このコメントは、ログを少し下って、アンインストール(既存の製品を削除する)が失敗した理由を示しています。完全なログファイル([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"の不自然さがあることに気づいた後、明示的にMsiSetPropertyを呼び出し、MsiDoActionを呼び出す前にCLIENTUILEVELを0に設定するという回避策が見つかりました。

これは、Windows Installer自体(RemoveExistingProducts中にCLIENTUILEVELを間違って設定している)のバグであると思われますが、何か別のことがわかりません。とにかく、私はこの変更に成功しました。おそらく他の人もそうすることができます。 :)

関連する問題