■72394 / inTopicNo.17) |
Re[9]: 実行中のプロセス取得について |
□投稿者/ とっちゃん (227回)-(2014/06/06(Fri) 17:42:25)
|
■No72393 (nobb さん) に返信 > どうやら、私の認識が大きくずれていそうなので確認させてください。 > 「可視ウィンドウを持つプロセス」(←普通に言う、ダイアログとかウィンドウでいいんですよね?)であれば、 > UpgradeCodeや、ComponentId等々を気にせずとも、インストールされるEXEが実行中の場合は、 > 自動的に判定(または何かしらのメッセージの表示??)を行ってくれる。 > > という事で大丈夫でしょうか??
「操作(更新あるいは削除)の必要があり、そのためにプログラムを終了させる必要がある場合」 であれば、上記のとおりとなります。
この時重要なのは、操作対象ファイルが利用中か?であり、そのファイルを利用しているのが誰か?は 特定しますが、誰がインストールしたものか?とかは考慮されません。
極端な例を挙げておきますね。 msvcr120.dll とか使っていると思います。 これらは、自分だけではなくほかの製品でも使っていますよね? VS2013 だけでいうと、無印、Update1 の2種類のランタイムが存在します(Update2はランタイムは更新されていません)。
これを、マージモジュールで自身の製品のインストーラに組み込んでいれば、更新するインストーラはもちろん 自分が作ったものとなりますし、このファイルを管理するインストーラは自分の作ったものとなります。
ですが、msvcr120.dll は自分だけじゃなく、VS2013を使って製品開発しているすべてのベンダーさんが配布する可能性がある ファイルです。 その中には、初期版のままのオンラインソフトとかもあるかもしれませんし、開発が終了した業務アプリとかで 半年とか一年とか放置されたままの製品かもしれません。
こういったものでも、稼働はしていますので、自分の製品と関係ないからと常駐ライクに動かしていれば当然引っかかります。
そういう場合でも問題なく表示してくれるのが利用中のアプリを表示する仕組み(MSIのFilesInUseダイアログの出る仕組み) となっています。
詳しくは。。。と思ったけど、どこを案内すればいいかわからないやw ということでトップを張っときます。 http://msdn.microsoft.com/en-us/library/cc185688.aspx
その昔、Windows Installer の開発チームのメンバーは、聖書を読むように毎日30分でいいからリファレンスを眺めろ と言っていたくらい、膨大なリファレンスですがw
> 以前(かなり前)、アップデートの実験をしている時に別製品としてインストールされたような記憶があったので・・・ > (もしかしたら製品名のスペース(半/全)とかが違ってた・・・?) > こっちは、全然違う話です。 PackageCode, ProductCode, UpgradeCode は、製品管理用の識別子でこちらはインストールする製品を プログラム的に識別するための存在です。 PackageCodeは、msi ごとにユニークな存在になるため、理論的には特定のPackageCode をもつ msiファイルはこの世に1つだけしか存在しないものとなります(バイナリ的な意味で)。
ProductCode は、製品そのものの識別子で、特定の製品のメジャーバージョンごとに一つというのが一般的です。 (アップデート手段によるので必ず同じとは限らない)。
UpgradeCodeは、同じ識別子を持つものは原則として上書きインストールされる(製品グループ的なもの)として 位置づけられているものです。
これらはそれなりに指針があり、こうすべきであるとかこう管理すると楽というのは存在しますが ぶっちゃけ何の管理もされていなくて。。。なんていう状況でもほとんどの場合困ったりしません。 (管理してなくても、ビルド可能な状況さえ残っていれば、情報が取れるため)。
> #インストーラーは難しい・・・ OSが提供するテクノロジでは、一番危険な仕組みですからね。作る側にとってやさしい要素は少ないと思いますよ。 しかも、SDKで書かれている内容と今の潮流(昨今のインストーラに求められるエクスペリエンス)はだいぶ違っています。
あと、多くの開発者が忘れていることなんですが、インストーラはその製品で一番最初にユーザーが触れるアプリケーションである ということも忘れてはならない大事な部分です。
|
|