次の方法で共有


msiファイルのアンインストール機能を利用したが、ファイルが削除されない

質問

2009年6月11日木曜日 12:03

はじめまして。
初投稿になりますが、皆様お力をお貸しください。

今回、仕事で初めてインストーラーを作成することになり初めてのことなのでドキドキしながら
作成に取り掛かったところ…

想定している動作と異なる動作が発生し、色々と調べてみても解消方法が
わからなかったため、このたび質問させていただきます。

(VB2005のセットアッププロジェクトを利用しmsiインストーラーを作成します。)

■質問

後述のインストーラーの要件上、インストールしたファイル(dll,jar)はアンインストール時に
必ず削除したいのですが、アンインストール時に削除できません。

なお、サンプルインストーラーを作成した再には、アンインストール時には問題なくファイルが
削除されていました。

■状況

 ①アンインストール時に削除されないケース(やりたいインストーラー要件)

  設定詳細:ファイルシステムエディタより、Windowsフォルダを作成し、
         その配下に、以下の構成でフォルダを作成。

         Windows
               ∟フォルダ
                     ∟フォルダ
                     |   ∟*.dll,*jar   
                     ∟フォルダ
                          ∟フォルダ
                                ∟*.dll,*jar   

 ②アンインストール時に削除されないケース(サンプル1)

  設定詳細:①と同様。

         Windows
               ∟フォルダ
                     ∟フォルダ
                           ∟*.dll,*jar   

 ③アンインストール時に削除されるケース(サンプル2)

  設定詳細:①と同様。

         Windows
               ∟フォルダ
                     ∟*.dll,*jar   

■インストーラーの要件

A.インストール対象のファイルはバージョンアップする可能性があるため、その都度インストーラも
  バージョンアップして提供する必要があります。

B.インストール対象の端末は、インストーラーのバージョンアップの都度インストールしなおす必要があります。
 また、現状(既にインストール済)の端末はインストールしなおしますが、端末を新規で導入する場合は、
 過去のインストーラーを実行せずに最新のインストーラーの適応のみとしたいです。
 (RemovePreviousVersionsプロパティをTrueにして対応しようと考えています。)

■実行環境

OS:WindowsXP SP3
開発環境:VB2005

■デフォルトから変更したプロパテイl

InstallAllUsers:True
RemovePreviousVersions:False

以上となります。
どうかお力をお貸しください!!
よろしくお願いします。

すべての返信 (6)

2009年6月16日火曜日 2:37 ✅回答済み

続報というか、おそらく回答になると思い、記載いたします!

インストール、アンインストール時のログを出力し、
出力された内容を成功時と失敗時で比較したところ
失敗時には、以下のログが出力されていることがわかりました。

●失敗時
ComponentId={ID○○},,BinaryType=0,PreviouslyPinned=1

●成功時
ComponentId={ID○○},,BinaryType=0

で、PreviouslyPinned=1を調査したところ、
既に他のインストーラーによって、該当のファイルがインストールされて
いるという状態を表すとのことでした。

http://community.installshield.com/showthread.php?p=425364

で、レジストリを検索したところ、

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\

直下に該当のdllのパスがありました。。。

おそらく理由はいかだと考えています。

①テストmsiインストーラーを作成
②何度かテストで作ったものをインストール・アンインストール
③インストール(Aインストーラー)したものを適切にアンインストールせずに、他のインストーラー(Bインストーラー)を実行
④上記のパスにファイルが残存

ですので、その様なテストを行っていないPCでは、レジストリにファイルパスも残存しておらず、
アンインストールがうまくいっています。。

お騒がせして済みませんでした。。。。
皆様のお力により、msiインストーラーについて非常に勉強になりました!!!!!!!


2009年6月12日金曜日 7:24

削除されないという部分については何とも言えませんが(おそらく設定の問題と思いますが、いろいろな状況を多角的に見てみないとわかりません)、それ以外の要件などは特に問題はないと思いますよ。

さて、問題の削除されないというケースですが、削除されない場合そこにすでに同名のDLLやJARが存在しているということはありませんか?
もし、存在しているようなら、そのファイルが共有ファイル(HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs にパスがあるかで判断可能) になっていないかを確認してみてください。

それと、Windows フォルダは特別なフォルダのWindowsフォルダですよね?
jar だからJava関係の何かかな?と思うのですが、階層が2段階とかなので、そのあたりが一番怪しいかな?と思われます。

この情報からだけでは何とも判断のしようがない部分かと。

わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/


2009年6月12日金曜日 9:17

とっちゃんさん

回答ありがとうございました!

とっちゃんさんからの質問についての回答ですが、以下のとおりです。

>削除されない場合そこにすでに同名のDLLやJARが存在しているということはありませんか?
インストール前には、格納対象資材は存在しません。
対象のフォルダもインストール時に新規に作成されるものとなります。

>Windows フォルダは特別なフォルダのWindowsフォルダですよね?
Windowsフォルダは、システムルートフォルダ(XP:C:\Windows)です。

なお、1点前述の条件に補足があります。

実行環境は、WindowsXP SP3、SP2です。
事象が発生するのは、Windows2000 SP4とある特定のWindowsXP SP3端末になります。

ある特定のWindowsXP SP3端末の環境に問題があるとは思いますが、
具体的に何が問題なのかがわかっていない状況です。。。

すいません。
何の情報を調べればよいかがわかっていなくて。。。


2009年6月12日金曜日 9:21 | 1 票

確認ですが、OSのクリアインストール直後の状態でも再現しますか?
再現しないなら、環境の問題であってmsiの問題ではないでしょう。


2009年6月12日金曜日 9:23 | 1 票

うーん。。。状況から推察すると、かなり個別に近い案件。。。かも。
2000のSP4は必ず発生しますか?

XPで特定のマシンだけということになると、違いを細かく調べるしかないですね。
こちらは、msiのバージョンとか、インストールしているアプリケーション、アンチウィルスなどソフト的な条件の差異をしらみつぶしにたどっていくという程度くらいしかないかな。

あと、もし過去に実験で消えないからばっさり削除!というようなことをしていた場合(XPマシン)は前述の共有フォルダなども調査をしてみてください。
影響があるかもしれません。

それと、NGなXPマシンが2000からのアップグレードかどうかがもし記録として残ってるのならそれも手掛かりにはなるかもしれません。
もし後者なら、2000が抱えてる何らかの問題がそのまま反映されているという可能性もあり得ます。

ただ、いずれにしてもこの先はもっと細かいレベルで情報がないとかなりつらいかもしれません。

まずは詳細をログをとるのと、WindowsSDK(もしくは、Windows Installer SDK4.5)を入れて、Orcaやその他の開発ツール類を導入するところからかな。

わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/


2009年6月12日金曜日 12:39

佐祐理**さん
**
回答ありがとうございます!

>確認ですが、OSのクリアインストール直後の状態でも再現しますか?
OSのクリアインストールの状態では、再現確認していません。
仕事で使うソフトなど色々インストールしているので、クリアインストールが出来ないんです。。

ただし、これまで一度も動作確認等を行っていない端末などで動作を試してみます。

とっちゃんさん

>2000のSP4は必ず発生しますか?
必ず発生します。。

>あと、もし過去に実験で消えないからばっさり削除!というようなことをしていた場合(XPマシン)は前述の共有フォルダなども
>調査をしてみてください。
他の端末ですので、来週月曜日にレジストリ検索してみます!

なお、私の記憶では、アンインストールしてもファイルが残存していたため、ばっさり削除していたと思います。。
ちなみに、W2K端末では該当フォルダにファイルは残存していなかった(アンインストール後、残存ファイルを削除したため)
のですがレジストリを検索したところ以下のパスに資材が登録されていました。

HKEY_USERS\キー\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\対象のdll

これは何か関連があるのでしょうか??

>NGなXPマシンが2000からのアップグレードかどうか
NGなXPマシンはW2Kからのアップグレードではありませんでした。

また、とっちゃんさんのおっしゃったとおり、詳細なログを確認しようと思い、
NG(アンインストール後ファイルが残存)、OK(アンインストール後ファイルが削除されている)のそれぞれの
場合、以下のログが出力されていることを確認しました。(W2K)

●失敗時
 
 インストール時のログ

  File: C:\WINNT\Sun\Java\bin\対象のdll; Won't Overwrite; Won't patch; Existing file is of an equal version

 アンインストール時のログ

  出力なし

●成功時

 インストール時のログ

  File: C:\WINNT\Sun\Java\対象のdll; To be installed; Won't patch; No existing file

 アンインストール時のログ

  FileRemove(,FileName=対象の.dll,,ComponentId={キー})

NGのときは、既に同じバージョンの資材がレジストリ上残存し、そのためインストール(上書き)に失敗?したため
アンインストール時に、ファイルが削除されないということを示しているのでしょうか。

なお、そうだとしてもNGのときにシステムフォルダ上に対象のフォルダはおろかdllも存在しないことを確認しています。

Orcaは一応インストール済みです。
使い方はわかったと思うのですが、有効に活用できていません。。

本当にわかりにくい文章ですいません。

みなさま、お忙しいところ私に力を貸してくださって本当にありがとうございます。