DOBON.NET どぼん!のVB道掲示板(プログラム)過去ログ

Windows Installerの自己修復機能について

先日、Win2000、VB6SP5の環境でアプリを作成し、これの配布パッケージをVSIで作成し、特に問題なく動作しておりました。
最近、一部ファイルのリリース(バージョンアップ)が必要となり、ネットワーク経由での単純ファイルコピーによりモジュールを入れ替えた(上書きコピーした)ところ、Windows Installerの自己修復機能により、旧ファイルへと書き戻されてしまいました。入れ替えたファイルの種類はexeファイルと独自のデータファイルだったのですが、exeファイルは入れ替わらず(修復されず)、データファイルのみが旧バージョンへと書き戻されてしまいます。
orcaでMSIを覗いてみてふと気がついたのですが、exeファイルはバージョンを持っていて上書きしたexeの方が新しいため上書きされなかった、データファイルは単にタイムスタンプが一致しない(新しいのに)ため破損と判断されて上書きされた…、のでしょうか。

インストール後にこの自己修復機能を切ることはできないものか、この回避方法をご存知の方がいらっしゃいましたら、ご教授いただけないでしょうか。

なお、初期インストールはAdminで行い、実行は一般ユーザで行なっていたのですが、一般ユーザの場合にはこの事象がおこらず、Adminでのみ発生します。

ちなみに「ちょおぶいびぃ会議室」さんにも同様の質問をしていますが、今のところレスを頂いておりませんの、こちらにも質問させて頂いております。
どうかご容赦ください。
>先日、Win2000、VB6SP5の環境でアプリを作成し、これの配布パッケージをVSIで作成し、特に問題なく動作しておりました。
>最近、一部ファイルのリリース(バージョンアップ)が必要となり、ネットワーク経由での単純ファイルコピーによりモジュールを入れ替えた(上書きコピーした)ところ、Windows Installerの自己修復機能により、旧ファイルへと書き戻されてしまいました。入れ替えたファイルの種類はexeファイルと独自のデータファイルだったのですが、exeファイルは入れ替わらず(修復されず)、データファイルのみが旧バージョンへと書き戻されてしまいます。
>orcaでMSIを覗いてみてふと気がついたのですが、exeファイルはバージョンを持っていて上書きしたexeの方が新しいため上書きされなかった、データファイルは単にタイムスタンプが一致しない(新しいのに)ため破損と判断されて上書きされた…、のでしょうか。
>
>インストール後にこの自己修復機能を切ることはできないものか、この回避方法をご存知の方がいらっしゃいましたら、ご教授いただけないでしょうか。
>
>なお、初期インストールはAdminで行い、実行は一般ユーザで行なっていたのですが、一般ユーザの場合にはこの事象がおこらず、Adminでのみ発生します。
>
>ちなみに「ちょおぶいびぃ会議室」さんにも同様の質問をしていますが、今のところレスを頂いておりませんの、こちらにも質問させて頂いております。
>どうかご容赦ください。

この質問に対する完全な回答は私にもなかなか出来ないので「回答発言」とはしておりません。
私は仕事でInstallShield for WindowsInstallerを使用していたことがあるので、多少はこの問題に関して知識がありますが、そうでないと全く見当もつかない問題だと思います。おまけにWindowsというOSそのものの「作り」に深く関わる問題であり、一概にWindowsといっても、95,98,Me,NT4,2K,XPそれぞれで少しずつ事情が異なってくる非常に厄介な問題です。当然、MSI、あるいはWindows自体のバグも関わっていたりします。

そのようなデリケートな問題なので、まず、
・正確なWindowsのバージョン(含枝版)(Adminと言っているのでNT系と思いますが)
を明らかにして下さい。そうでないと正確な回答はできません。
それから、私が是非知りたい点として
・exeのバージョンは上がったのか? 同じままでタイムスタンプだけ新しいのか?
を教えて下さい。

とりあえず、基本的なことを先に述べさせて頂くと、
1.自己修復機能はMSIの機能である。
2.Windows2000とそれ以降にリリースされたWindowsはすべて、OS自身がMSIでセットアップされているため、OS全体が自己修復機能に支配されている。
3.Win2k以前のWindowsでも、MSIによってインストールされたアプリケーションは自己修復の対象になる。
などが挙げられます。

その他に、
・WindowsMe(Win2k以降のOSである)のドライバファイルは署名付でないと組込めない(自己修復ではじかれる)、とMicrosoftのFAQにあったが、これとMSIとの関連は???不明

また、InstallShield for WindowsInstallerで開発をしていたときの経験から、あるバージョンでは、既存ファイルに対して「常に上書き」するように指定しているにも拘らず、バージョンやタイムスタンプの比較をしてしまうものと、しないものがありました。

以上のような状況ですので、原因となりそうな候補がたくさんあって、これだけの情報ではそれを特定できません。もう少し詳しい情報を下さい。

とりあえずの解決策として、アンインストールしてから、再インストールするようには出来ないのでしょうか?
こんにちは。管理人のどぼん!です。私もWindows Installerの自己修復機能を無効にする方法はまったく分かりませんが(無理なのでは?)、幾つか気になる点を書かせていただきます(乱入するような形になってしまい恐縮です)。

Windows Installerの自己修復機能がいったい何を行っているのか詳しく知りませんのではっきりとしたことはいえませんが、インストール元のmsiファイルや上書きされる前のファイルがどこにも存在しなければ修復も出来ないのではないでしょうか?つまりこれらのファイルを削除すれば修復も出来なくなると思うのですが。(多分それは無理ということだとは思いますが。)

もしどうしても自己修復機能が邪魔なのであれば、他のインストーラを使うべきではないでしょうか。

ちなみに私もXP HEにおいて、Windows InstallerでインストールしたアプリのEXEファイルを入れ替えてみる実験をしてみましたが、バージョンアップ、ダウンともに書き戻されることはありませんでした。(昔、別のOSでやった時は私のサイトにあるように書き直されたと思ったのですが。)

また、Kamaliさんの発言についてぜひ伺いたいことがあるのですが、よろしいでしょうか?

>とりあえずの解決策として、アンインストールしてから、再インストールするようには出来ないのでしょうか?

とのことですが、この方法を使わずに、Windows Installerで特定のファイルのみを入れ替える(バージョンアップ、もしくはバージョンダウンも含めて)ことは可能でしょうか?以前私はこの方法をいろいろ調べ、どうやらpatch fileとやらを作れば出来るかもと思ったのですが、訳が分からずあっさりと挫折したことがあります。このあたりのことをご存知でしたら教えていただけないでしょうか?
Kamali さま、どぼん!さま

レス本当にありがとうございます。心強いです!

考えるに、アプリのバージョンアップはどこにでもある話です。
Windows Installer + MSI でも当然その手段はあるはずで、
恐らく、バージョンアップするファイルをパックした MSIファイル を
上書きすれば解決! なのでしょう。
ちなみに動作環境は Win2000 + SP2、ie パッチは当てていません。

いくつかご提案をいただきましたが、

1)MSI ファイルを削除する
  当該アプリが起動不能となり NG です。
2)再インストールする
  すでに毎日の運用に入っていますので、再度の動作確認など考えますと
  現実的に厳しいです。

そもそもの問題は、単純コピーでファイルのアップを試みた点だと思っています。
とりあえず試行しようと考えているのが、

1)Windows Installer サービスを止める
  デフォルトのサービス起動状態は「手動」となっていますが、
  アンインストールする。
  この場合、他アプリのインストール(自己修復)にも影響しますが。
2)レジストリを書き換える
  MSDN-JP227181 にあるような方法でレジストリにより回避する。

とりあえず、この2点は試行しますが、
何か他に良い方法があればご教授いただきたいと思います。
本当にありがとうございます。
>考えるに、アプリのバージョンアップはどこにでもある話です。
>Windows Installer + MSI でも当然その手段はあるはずで、
>恐らく、バージョンアップするファイルをパックした MSIファイル を
>上書きすれば解決! なのでしょう。
>ちなみに動作環境は Win2000 + SP2、ie パッチは当てていません。

ふむ、MSI標準装備のOSを使っていたわけですね。

>いくつかご提案をいただきましたが、
>
>1)MSI ファイルを削除する
>  当該アプリが起動不能となり NG です。

%windir%\Installer\ にあるヘンな名前にリネームされた*.msiを直に消し去ったのですね。でも、それはまずいんですよ。

>2)再インストールする
>  すでに毎日の運用に入っていますので、再度の動作確認など考えますと
>  現実的に厳しいです。
>
>そもそもの問題は、単純コピーでファイルのアップを試みた点だと思っています。

私は、アップデート用に新たなMSIを作成して行ったと思っているのですが、もしかしてホントに「単純コピー」だったのですか? だとするとそれは絶対無理です。

>とりあえず試行しようと考えているのが、
>
>1)Windows Installer サービスを止める
>  デフォルトのサービス起動状態は「手動」となっていますが、
>  アンインストールする。
>  この場合、他アプリのインストール(自己修復)にも影響しますが。

これは却下ですね。サービスが動けばもとに戻ってしまう。

>2)レジストリを書き換える
>  MSDN-JP227181 にあるような方法でレジストリにより回避する。

これなら確実にできますが、飽くまでも最終手段と考えてください。

私は、VSIなるものでインストーラを作った経験がなく、あるのは InstallShield for WindowsInstaller(以後、ISWI)ですので、開発ツールの持っている機能で異なる点があるかと思います。また、VSIでどのようにインストーラを作成したのかも、アップグレードのインストール方法も、分っていないので、私が正確な回答を示すことはまず不可能だと思っています。ですから、どぼんさんからの質問も踏まえ、MSIの基本的なことを説明するので、後は指向錯誤で対策を見つけて頂くしかありません。

MSI(WindowsInstallerサービスの本体)によってインストールを行うと、アプリケーション構成ファイルとは別に、*.msiというパッケージそのものも、知らぬ顔をして %windir%\Installer(隠しフォルダなので見つけられない人もいるかも)にコピーされています。アプリケーション構成ファイルが破損を受けたことをMSIが検知すると、このパッケージを基にして修復が行われるというのが、MSIのからくりです。また、MSIには「必要になったときインストールする」という指定ができることもご存知と思いますし、修復が必要になったとき、インストールCDを要求するようにすることも可能です。

このようなことが可能なのはレジストリに、インストールした個々のファイル情報が登録されているからです。従って、レジストリからその登録を抹消すれば当然、修復処理は抑止可能です。

でも、その最終手段に訴える前に確認しておくことがあります。当たり前のことですが、MSIでインストールしたアプリは、アンインストールもアップグレードも可能です。ただし、単純にファイルを差替えても駄目です。MSIでしか、アンインストールやアップグレードは出来ません。すべての疑問、トラブルはすべてここから来ているのだと思います。

更に付け加えるなら、ISWIで開発したときは、最初から自動修復を使用しないインストーラを作りました。それは、試作版の失敗から学んだ結果ですが。つまり、インストールに当って、レジストリ登録をしないようにインストーラを作ることが可能でした。しかし、VSIでもそれが可能かどうかは分りません。
いずれにしても、インストールすると、コントロールパネルの「アプリケーションの追加と削除」にそれが表示され、そこから「アンインストール」しようとするとMSIが起動し、インストールしたときの*.MSIパッケージを「アンインストール」モードで開きます。
確かに、ISWIはインストーラとアンインストーラをひとつのMSIパッケージとして開発できるようになっていました。でも、アンインストール機能は作ってないので、「アンインストール」しても何も消えませんでした。そのとき、画面には「アップグレード」か「修復」というメニューも表示されていたような記憶もあります(定かではないが…)。
また、VSIではどうか分りませんが、インストーラ開発時、個々のファイルのインストール方法として、「常に上書きインストール」「バージョン比較」「常に上書きしない」の3つから選択できました。ただし、バージョンを持たないデータファイルについてタイムスタンプ比較が有効だったかどうかは定かではありません。それにはISWIかMSIのバグも関係しているみたいでした。

どぼんさんの質問の回答としては、
・Windows Installerの自己修復機能を無効にする方法
→最初からそのようにインストーラを開発できます。でも、ひとたび自己修復モードでインストールしてしまうと、そのMSIパッケージでアンインストールしない限りもうどうにもなりません。

・「アンインストールしてから、再インストール」とは?
→MSIパッケージは普通アンインストーラ機能を含んでいます。MSIを使って正しい手順でアンインストールすれば、新規インストールと同じ手順でインストールできる筈です。
こんにちは。どぼん!です。返信ありがとうございました。

>>そもそもの問題は、単純コピーでファイルのアップを試みた点だと思っています。
>
>私は、アップデート用に新たなMSIを作成して行ったと思っているのですが、もしかしてホントに「単純コピー」だったのですか? だとするとそれは絶対無理です。

前の投稿で報告したとおり、私の環境では(OS:XP HE/WI:2.0)exeの単純コピーでも一応はできたようなのですが。具体的にはどのような問題があるのでしょうか?

>MSI(WindowsInstallerサービスの本体)によってインストールを行うと、アプリケーション構成ファイルとは別に、*.msiというパッケージそのものも、知らぬ顔をして %windir%\Installer(隠しフォルダなので見つけられない人もいるかも)にコピーされています。

ここにコピーされるmsiファイルはインストールしたパッケージそのものではないような気がするのですが。たぶん情報のみではないでしょうか?もしそうならインストールした元のmsiファイルを削除してしまえばファイルの完全な修復は出来なくなりそうですが。

>更に付け加えるなら、ISWIで開発したときは、最初から自動修復を使用しないインストーラを作りました。それは、試作版の失敗から学んだ結果ですが。つまり、インストールに当って、レジストリ登録をしないようにインストーラを作ることが可能でした。しかし、VSIでもそれが可能かどうかは分りません。

これはインストールする際のmsiexecへのコマンドラインの指定で可能かもしれません(REINSTALLMODEプロパティ)。ただしそのようなmsiファイルが作れるかは分かりません。よって、Setup.exeなどによりインストールしてもらうことになってしまいます。


さて、私が前回質問させていただいた事についてですが、もう一度説明させてください。例えばあるアプリをバージョンアップさせる際、そのアプリに必要なすべてのファイルをmsiファイルとして配布するとサイズが馬鹿でかくなってしまうため、新しく更新されたファイルのみをパッケージにしサイズを小さくして配布したいというケースもあります。このようなパッケージを作成することは可能なのかということを伺いたかったのです。Patch Packagesというのがそれかと思ったのですが、よく分からなかったもので。

いや、Windows Installerは難しすぎて私の手には負えません。せめて日本語のヘルプがあればなぁ。
>こんにちは。どぼん!です。返信ありがとうございました。
>
>>>そもそもの問題は、単純コピーでファイルのアップを試みた点だと思っています。
>>
>>私は、アップデート用に新たなMSIを作成して行ったと思っているのですが、もしかしてホントに「単純コピー」だったのですか? だとするとそれは絶対無理です。
>
>前の投稿で報告したとおり、私の環境では(OS:XP HE/WI:2.0)exeの単純コピーでも一応はできたようなのですが。具体的にはどのような問題があるのでしょうか?

単純コピーで大丈夫ということは、レジストリ登録されないような
インストールだったのだと思うので、問題はないと思います。

>>MSI(WindowsInstallerサービスの本体)によってインストールを行うと、アプリケーション構成ファイルとは別に、*.msiというパッケージそのものも、知らぬ顔をして %windir%\Installer(隠しフォルダなので見つけられない人もいるかも)にコピーされています。
>
>ここにコピーされるmsiファイルはインストールしたパッケージそのものではないような気がするのですが。たぶん情報のみではないでしょうか?もしそうならインストールした元のmsiファイルを削除してしまえばファイルの完全な修復は出来なくなりそうですが。

インストール時のmsiがリネームされて置かれているだけです。
比較すればすぐわかります。
このmsiファイルを削除しても、修復処理は起動します。そして、
なにかエラーを出して終わります。(よく覚えていないが)

>>更に付け加えるなら、ISWIで開発したときは、最初から自動修復を使用しないインストーラを作りました。それは、試作版の失敗から学んだ結果ですが。つまり、インストールに当って、レジストリ登録をしないようにインストーラを作ることが可能でした。しかし、VSIでもそれが可能かどうかは分りません。
>
>これはインストールする際のmsiexecへのコマンドラインの指定で可能かもしれません(REINSTALLMODEプロパティ)。ただしそのようなmsiファイルが作れるかは分かりません。よって、Setup.exeなどによりインストールしてもらうことになってしまいます。

これは、修復モードでインストーラを実行させるという意味です。
私が言ったのは、インストール処理として、レジストリ情報を生成しない
という意味で、ISWI(またはIPWI)で具体的にどのようにインストーラを
作成したか、いまは過去のこととなって私の記憶には残っていないため、
これ以上説明できません。

>さて、私が前回質問させていただいた事についてですが、もう一度説明させてください。例えばあるアプリをバージョンアップさせる際、そのアプリに必要なすべてのファイルをmsiファイルとして配布するとサイズが馬鹿でかくなってしまうため、新しく更新されたファイルのみをパッケージにしサイズを小さくして配布したいというケースもあります。このようなパッケージを作成することは可能なのかということを伺いたかったのです。Patch Packagesというのがそれかと思ったのですが、よく分からなかったもので。

恐らく、そうだと思います。でも、作ってみたことがないため、
詳細は不明です。ホントに日本語のドキュメントが欲しいですね。
でも、ある程度のことは、MSI対応のInstallShield製品を買うと
日本語ヘルプが付いてきます。でも、基本的なことしか出ていませんが。
Kamaliさん、いつもありがとうございます。

%windir%\Installerにmsiのコピーがおかれる件ですが、私がVisual Studio Installerで作成したmsiについて自分のパソコンにインストールしてみたところ(「勝手にビューアVer0.64」というやつです)、やはり元のmsiと%windir%\Installerに出来るmsiは違うようですが。サイズが全然違います(1.74MBと214KB)。InstallShieldの場合と違うのでしょうか(InstallShieldはmsiにファイル自体は含めないとか)。それとも私がどこか抜けているのでしょうか(自信がなくなってきた...)。

ちなみにこの場合、実行ファイルを削除してWindows Installerが作成したショートカットをダブルクリックすると修復されますが、インストール元のmsiファイルを削除すると修復できずにエラーが出ました。

また、「修復モードでインストーラを実行させる」件ですが、これもmsiexecへのコマンドラインの指定で可能かと思われます。

InstallShieldは高いだけあってやはりよさそうですね。使ってみたい気持ちは山々なのですが、やはり買うのは私には絶対無理です。Windows Installerに対応したもうちょっとましなフリーのインストーラが出てくれないかなぁなどとひそかに期待しています。
遅レス失礼いたします。
みなさま、ありがとうございます。
本件につきまして、考えている対応を示させて頂きます。

Windows Installer は大変正直だということが分かりましたので、
根本から対応を変えるよう考えております。
以前申しました通り、exe や dll は問題ないのですが、
Windows Installer 配下でデータファイルをリリースするには、

1.差分ファイルをパックした MSI を上書きインストールする
2.一度アンインストールし、最新ファイルでパックした MSI を
  インストールする

しかないと考えています。
ただ、今回のシステムは端末も多く、地理的にも分散していますので、
今後のメンテのことを考えると、何とか単純コピーで行けるように
考えたいと思っています。

よって対応としては、一度すべてをアンインストールした上で、
ファイルを単純コピーし、dll を regsvr で登録する、
こうすれば Windows Installer の配下ではなくなるはずで、
今後のファイルリプレイスでも単純コピーでいけるかな、と考えています。
サーバが Windows であれば何らか他の方法はありそうですが、
今回はサーバが SUN で、しかもファイル単純配信用の
ミドルも載っていますので、
単純コピーで行けるようなインストールで考えたいと思っています。

そもそも、この配信のミドルが Windows Installer の動きを
考えていないことが問題なのですが…

結局こちらの掲示板の趣旨から外れた結論で申し訳ありません。
kamali さま、どぼん さま、本当にありがとうございました。
大変助かりました。
>Kamaliさん、いつもありがとうございます。
>
>%windir%\Installerにmsiのコピーがおかれる件ですが、私がVisual Studio Installerで作成したmsiについて自分のパソコンにインストールしてみたところ(「勝手にビューアVer0.64」というやつです)、やはり元のmsiと%windir%\Installerに出来るmsiは違うようですが。サイズが全然違います(1.74MBと214KB)。InstallShieldの場合と違うのでしょうか(InstallShieldはmsiにファイル自体は含めないとか)。それとも私がどこか抜けているのでしょうか(自信がなくなってきた...)。

ふむ。そうですか...私が間違っているのかも知れません。

>ちなみにこの場合、実行ファイルを削除してWindows Installerが作成したショートカットをダブルクリックすると修復されますが、インストール元のmsiファイルを削除すると修復できずにエラーが出ました。
>
>また、「修復モードでインストーラを実行させる」件ですが、これもmsiexecへのコマンドラインの指定で可能かと思われます。
>
>InstallShieldは高いだけあってやはりよさそうですね。使ってみたい気持ちは山々なのですが、やはり買うのは私には絶対無理です。Windows Installerに対応したもうちょっとましなフリーのインストーラが出てくれないかなぁなどとひそかに期待しています。

あれは自分で買うものではない。おまけに、何とかしてほしいバグが
沢山あったりして...
これらのバグの嫌らしいところは、ISが悪いのか、MSが悪いのか
はっきりしないから困ります。

多分、私はもうインストーラに関わる仕事はしないと思いますが、
頼まれても、二度としたくないと思っているほどMSIは厄介ものです。

それから、てつさんへ。
一つだけ気になったのは、exe, dllはOKで、その他がNGという点です。
修復されてしまう、しまわないとは別の問題で、インストーラでは、
既存ファイルを上書きするかどうかを、
「常に上書き」
「バージョンが高ければ上書き」
の二つから選択できるようになっています。
(ISWI等、IS製品で開発したインストーラに限ったことでなく、
WindowsInstaller固有の仕様、、、と思っている)
でも、バージョン情報を持たない「その他のファイル」の扱いが
はっきりしないのです。確か「常に上書き」を指定しておかないと
うまく書き換えてくれなかった気がします。MSIを使用していない従来の
InstallShield5.5等で開発したものであれば、その辺は簡単に
「日付を比較して新しければ上書き」という指定が出来たんですけどね。
だから、WindowsInstallerでインストーラを作るときは、
 ・ファイルをレジストリに登録させない
 ・常にファイルを上書きさせる
というのが一番安全です。
InstallShieldはそんなにひどいですか。インストーラでバグが多いというのは困りものですね。

そもそもインストーラなんてものは面白くもなんともないものでしょうから、すすんで勉強したいという人はほとんどいないでしょう。それだけにインストーラは簡単にして欲しいものですが、Windows Installerの難解さといったらたまりません。ほんと、何とかして欲しいです。

てつさんはWindows Installerを使わないという選択をされたようですが、優秀な(無料の)インストーラは他にもたくさんありますので、それで十分ではないでしょうか。インストーラ選びには私のサイトも参考にしてくださいね。
>>Kamaliさん、いつもありがとうございます。
>>
>>%windir%\Installerにmsiのコピーがおかれる件ですが、私がVisual Studio Installerで作成したmsiについて自分のパソコンにインストールしてみたところ(「勝手にビューアVer0.64」というやつです)、やはり元のmsiと%windir%\Installerに出来るmsiは違うようですが。サイズが全然違います(1.74MBと214KB)。InstallShieldの場合と違うのでしょうか(InstallShieldはmsiにファイル自体は含めないとか)。それとも私がどこか抜けているのでしょうか(自信がなくなってきた...)。
>
>ふむ。そうですか...私が間違っているのかも知れません。
>
>>ちなみにこの場合、実行ファイルを削除してWindows Installerが作成したショートカットをダブルクリックすると修復されますが、インストール元のmsiファイルを削除すると修復できずにエラーが出ました。
>>
>>また、「修復モードでインストーラを実行させる」件ですが、これもmsiexecへのコマンドラインの指定で可能かと思われます。
>>
>>InstallShieldは高いだけあってやはりよさそうですね。使ってみたい気持ちは山々なのですが、やはり買うのは私には絶対無理です。Windows Installerに対応したもうちょっとましなフリーのインストーラが出てくれないかなぁなどとひそかに期待しています。
>
>あれは自分で買うものではない。おまけに、何とかしてほしいバグが
>沢山あったりして...
>これらのバグの嫌らしいところは、ISが悪いのか、MSが悪いのか
>はっきりしないから困ります。
>
>多分、私はもうインストーラに関わる仕事はしないと思いますが、
>頼まれても、二度としたくないと思っているほどMSIは厄介ものです。
>
>それから、てつさんへ。
>一つだけ気になったのは、exe, dllはOKで、その他がNGという点です。
>修復されてしまう、しまわないとは別の問題で、インストーラでは、
>既存ファイルを上書きするかどうかを、
>「常に上書き」
>「バージョンが高ければ上書き」
>の二つから選択できるようになっています。
>(ISWI等、IS製品で開発したインストーラに限ったことでなく、
> WindowsInstaller固有の仕様、、、と思っている)
>でも、バージョン情報を持たない「その他のファイル」の扱いが
>はっきりしないのです。確か「常に上書き」を指定しておかないと
>うまく書き換えてくれなかった気がします。MSIを使用していない従来の
>InstallShield5.5等で開発したものであれば、その辺は簡単に
>「日付を比較して新しければ上書き」という指定が出来たんですけどね。
>だから、WindowsInstallerでインストーラを作るときは、
> ・ファイルをレジストリに登録させない
> ・常にファイルを上書きさせる
>というのが一番安全です。


はじめましてryuseiともうします
とても初歩的な質問になってしまうかもしれませんが、WindowsInstallerを使用してインストールを行いましたが、その後のバージョンアップを行いたいのですが、インストール時に「ファイルを常に上書きする」という指定はどこで行えるのでしょうか?
VBに適したインストーラを探そうの中でVisual Studio Installerでバージョンを比較してコピーの欄に"○"が付いていたのですが、どのように行えばよいのでしょうか?
その節はお世話になりました。てつです。
ご質問の件ですが、わかる範囲で。。。

>とても初歩的な質問になってしまうかもしれませんが、WindowsInstallerを使用してインストールを行いましたが、その後のバージョンアップを行いたいのですが、インストール時に「ファイルを常に上書きする」という指定はどこで行えるのでしょうか?
>VBに適したインストーラを探そうの中でVisual Studio Installerでバージョンを比較してコピーの欄に"○"が付いていたのですが、どのように行えばよいのでしょうか?

通常のバージョンアップであるなら、差分ファイルだけをパックしたMSIを上書きインストールすれば大丈夫だと思います。ただ、この辺は好みの問題かもしれませんが、旧バージョンをアンインストールした後、新バージョンのフルパックMSIをインストールする手もあるかと。いずれにしても、MSIをベースにしてバージョンを上げるなら、アプリの動作に問題はないと思います。
以上、ご参考になれば幸いです。
>その節はお世話になりました。てつです。
>ご質問の件ですが、わかる範囲で。。。
>
>>とても初歩的な質問になってしまうかもしれませんが、WindowsInstallerを使用してインストールを行いましたが、その後のバージョンアップを行いたいのですが、インストール時に「ファイルを常に上書きする」という指定はどこで行えるのでしょうか?
>>VBに適したインストーラを探そうの中でVisual Studio Installerでバージョンを比較してコピーの欄に"○"が付いていたのですが、どのように行えばよいのでしょうか?
>
>通常のバージョンアップであるなら、差分ファイルだけをパックしたMSIを上書きインストールすれば大丈夫だと思います。ただ、この辺は好みの問題かもしれませんが、旧バージョンをアンインストールした後、新バージョンのフルパックMSIをインストールする手もあるかと。いずれにしても、MSIをベースにしてバージョンを上げるなら、アプリの動作に問題はないと思います。
>以上、ご参考になれば幸いです。


申し訳ありませんが、実はその上書きインストールの方法がわからないのです、普通にインストールしただけでは上書きインストールにならないと思うので、何か上書きするための設定があるのでしょうか?
ryusei wrote:
はじめましてryuseiともうします
とても初歩的な質問になってしまうかもしれませんが、WindowsInstallerを使用してインストールを行いましたが、その後のバージョンアップを行いたいのですが、インストール時に「ファイルを常に上書きする」という指定はどこで行えるのでしょうか?
VBに適したインストーラを探そうの中でVisual Studio Installerでバージョンを比較してコピーの欄に"○"が付いていたのですが、どのように行えばよいのでしょうか?

てつ wrote:
通常のバージョンアップであるなら、差分ファイルだけをパックしたMSIを上書きインストールすれば大丈夫だと思います。ただ、この辺は好みの問題かもしれませんが、旧バージョンをアンインストールした後、新バージョンのフルパックMSIをインストールする手もあるかと。いずれにしても、MSIをベースにしてバージョンを上げるなら、アプリの動作に問題はないと思います。
以上、ご参考になれば幸いです。

ryusei(??) wrote:
申し訳ありませんが、実はその上書きインストールの方法がわからないのです、普通にインストールしただけでは上書きインストールにならないと思うので、何か上書きするための設定があるのでしょうか?

Kamaliです。
てつさん、助け舟、ありがとうございました。
私の不確かな回答で皆さんにご迷惑をお掛けして誠に申し訳ありません。
既に私の手元にかつて使用していた開発ツール、
・IstallShield for WindowsInstaller Professional(IPWI)
が無い上に、MSIインストーラを開発する他の方法についての知識が余り無いもので、皆さんの期待しているような回答が出来るかどうか不安です。

「上書きインストール」のことですが、EXE, DLLについては、その「ファイルバージョン」が既存のファイルより大きいなら、難しく考えなくても普通は上書きされます。けれど、EXE/DLL以外がどう処理されるのか私にはよく分りません。またファイルごとに「常に上書きしない」という指定も確か、あった気がします。でも、それは気にしないでいいでしょう。
それから、バージョンと言うことでは、MSIパッケージに付けるバージョンもありますね。当然ですが、これは以前に作ったパッケージより大きくしておかないといけないですね。

この「常に上書き」「常に上書きしない」「新しかったら上書き」という指定をどこでするかという質問なんですが、それはMSIパッケージの中に指定します。MSIの開発とは、一言で言えば「MSIパッケージ」を作ることですから。IPWIで開発する場合、これはとても簡単に出来ました。VBのプロパティ・シートみたいなところで、目的のファイルのプロパティにそれを指定するだけでした。

そして、もしこれがIPWIだけの独自機能でなく、MSI一般の機能だとすれば、この指定はMSIパッケージのどこかに保存されているはずだと私は考えました。しかし、果たしてそれが正しかったかどうか、ちょっと自信がありません。

MSIパッケージはRDBみたいなもので、沢山のテーブルの塊です(ACCESSをご存知なら、なんとなく分るでしょう)。インストーラ開発はUIを作ることも重要ですが、インストールそのものをどう行うかは、以下のテーブルの内容で決ると言っていいでしょう。

・Feature(機能)…典型は「フルインストール」「最小インストール」「カスタムインストール」
・Component…Featureごとにインストールするファイルをグループ化するためのもの
・File…インストールするファイルの情報、その他

「常に上書き」を指定する場所がもし本当にあるとすれば、FileかComponetか、その両方です。多分両方のような気がします。
私がいま思い出せるのは、このくらいです。こんな回答で、お役に立ったでしょうか?
回答が遅れてすみません。いまさら遅すぎるかもしれませんが・・・。

>とても初歩的な質問になってしまうかもしれませんが、WindowsInstallerを使用してインストールを行いましたが、その後のバージョンアップを行いたいのですが、インストール時に「ファイルを常に上書きする」という指定はどこで行えるのでしょうか?
>VBに適したインストーラを探そうの中でVisual Studio Installerでバージョンを比較してコピーの欄に"○"が付いていたのですが、どのように行えばよいのでしょうか?

丸が付いている理由は、新しいファイルのみが上書きされるようになっているからです。丸付けの説明については「1.VBのインストーラで必要な機能は何か」をご覧ください。

http://dobon.net/vb/installer/installer1.html

> 申し訳ありませんが、実はその上書きインストールの方法がわからないのです、普通にインストールしただけでは上書きインストールにならないと思うので、何か上書きするための設定があるのでしょうか?

これは前にも出た話題だと思います。「msiパッケージの内容をプログラムから参照するには?」のスレッドをご覧ください。

http://www.sky-j.com/viewlist.php?arg_forum_id=38&arg_thread_id=555&arg_message_id=555

DOBON.NET | プログラミング道 | プログラミング掲示板