DOBON.NET DOBON.NETプログラミング掲示板過去ログ

インストールされているアプリをチェックするには

環境/言語:[WindowsXP]
分類:[.NET]

kageです。お世話になります。

アプリケーションのインストール状況をチェックする方法はありませんでしょうか?
File.Exsistでexeを探すという原始的な方法は簡単に思いつきますが、インストールフォルダの名前が変更になっていればチェックできません。
「アプリケーションの追加と削除」のリストが得られれば、正確にチェックできると思うのですが…。
よろしくお願いします。
アプリケーションの追加と削除についてはエントリの情報を
レジストリが管理しています。
参考URL
http://support.microsoft.com/default.aspx?scid=kb;ja;247501

■No6125に返信(kageさんの記事)
> kageです。お世話になります。
>
> アプリケーションのインストール状況をチェックする方法はありませんでしょうか?
> File.Exsistでexeを探すという原始的な方法は簡単に思いつきますが、インストールフォルダの名前が変更になっていればチェックできません。
> 「アプリケーションの追加と削除」のリストが得られれば、正確にチェックできると思うのですが…。
> よろしくお願いします。
Mooさん、お世話になります。

> アプリケーションの追加と削除についてはエントリの情報を
> レジストリが管理しています。
> 参考URL
> http://support.microsoft.com/default.aspx?scid=kb;ja;247501

レジストリの読み方はわかりました。
ただ、Uninstallフォルダ内には、インストールしたアプリケーション数の30桁以上の長い名前のフォルダがあります。
フォルダ名は、同一アプリケーションであれば違うPCにインストールしても同じようですが、バージョンによる管理が大変です。
ファイルやフォルダはScriptingFileSystemObjectの場合、For Each で同一フォルダ内にあるフォルダ名やファイル名を順次取得することができますが、レジストリの場合にも同じようなやり方ができないものでしょうか?
よろしくお願いします。 kage
えっと、直接解答書いてもいいけど
キーの列挙がわかりやすいサンプルを示します。

http://ast.pekori.to/wiki/wiki.cgi?sample%2f040913Registry

この方法だと、HKCUとHKLMからサブキーの列挙を作成しています。
Uninstall関連の情報はMSDNを再確認してくださいね。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnw2kcli/htm/AppSpecDesk3.asp


■No6141に返信(kageさんの記事)
> Mooさん、お世話になります。
>
>>アプリケーションの追加と削除についてはエントリの情報を
>>レジストリが管理しています。
>>参考URL
>>http://support.microsoft.com/default.aspx?scid=kb;ja;247501
>
> レジストリの読み方はわかりました。
> ただ、Uninstallフォルダ内には、インストールしたアプリケーション数の30桁以上の長い名前のフォルダがあります。
> フォルダ名は、同一アプリケーションであれば違うPCにインストールしても同じようですが、バージョンによる管理が大変です。
> ファイルやフォルダはScriptingFileSystemObjectの場合、For Each で同一フォルダ内にあるフォルダ名やファイル名を順次取得することができますが、レジストリの場合にも同じようなやり方ができないものでしょうか?
> よろしくお願いします。 kage
Mooさん、お世話になります。


> えっと、直接解答書いてもいいけど
> キーの列挙がわかりやすいサンプルを示します。
>
> http://ast.pekori.to/wiki/wiki.cgi?sample%2f040913Registry

これ、やってみました。ところが
For Each foo As String In strSubkey
Console.WriteLine("HKCU:{0}", foo)
Next
の部分で「オブジェクト参照がオブジェクト インスタンスに設定されていません。 」のエラーが発生し、どうにも進みません。
よろしくお願いします。
kage
どうやらHKCU内にはエントリがないようですね。
これはうかつでした。
当該ロジックをTRY-CATCHで括ってください。

Try
For Each foo As String In strSubkey
Console.WriteLine("HKCU:{0}", foo)
Next
Catch ex as Exception
'データがない(strSubKeyが空の場合「ぬるぽ」発生)ので何もしない
End Try

あのページのほうも後で直しておきます...

■No6160に返信(kageさんの記事)
> Mooさん、お世話になります。
>
>
>>えっと、直接解答書いてもいいけど
>>キーの列挙がわかりやすいサンプルを示します。
>>
>>http://ast.pekori.to/wiki/wiki.cgi?sample%2f040913Registry
>
> これ、やってみました。ところが
> For Each foo As String In strSubkey
> Console.WriteLine("HKCU:{0}", foo)
> Next
> の部分で「オブジェクト参照がオブジェクト インスタンスに設定されていません。 」のエラーが発生し、どうにも進みません。
> よろしくお願いします。
> kage
>
余談ですが

「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
が発生した理由(またはメッセージそのものの意味)がわからないのであれば、
そこから学習したほうがいいと思いますよ。

水無月 ばけら氏の説明がわかりやすいのでリンクを提示します。
http://altba.com/bakera/hatomaru.aspx/glossary/30aa30d630b830a730af30c853c27167304c30aa30d630b830a730af30c8002030a430f330b930bf30f330b9306b8a2d5b9a3055308c30663044307e305b30933002

そうしないと同様のエラーが発生したときに対処方法がわからない
という事態になりかねません。

#全体を何も考えずにTry-Catchするのは危険ですし。
■No6163に返信(Mooさんの記事)
> 'データがない(strSubKeyが空の場合「ぬるぽ」発生)ので何もしない

どうも反応してしまいますねぇ...。
ところで、Javaではないので「ぬるぽ」ではないんじゃないでしょうか?

# 正しくは「ぬるり」でしょうか? (^^;
あー
気づかれてしまいました。

じゃあVB6/VBA的に
'データがないので何もしない
'(strSubKeyがNullの場合「Null値の使い方が不正です」発生)

と書き直しましょう:)
VB6からの移行開発者なら上記の説明が一番しっくりくると思います。

[本音]Microsoftさんはエラーメッセージを難読化しすぎです。[/本音]

[広告]Webサイト作りました。誰かレビューしてください。
http://ast.pekori.to/aspplusplus/[/広告]

■No6165に返信(java.lang.Nullpoさんの記事)
> ■No6163に返信(Mooさんの記事)
>>'データがない(strSubKeyが空の場合「ぬるぽ」発生)ので何もしない
>
> どうも反応してしまいますねぇ...。
> ところで、Javaではないので「ぬるぽ」ではないんじゃないでしょうか?
>
> # 正しくは「ぬるり」でしょうか? (^^;
Mooさん、お世話になります。

できました!ありがとうございました。

> どうやらHKCU内にはエントリがないようですね。
> これはうかつでした。
> 当該ロジックをTRY-CATCHで括ってください。
>
> Try
> For Each foo As String In strSubkey
> Console.WriteLine("HKCU:{0}", foo)
> Next
> Catch ex as Exception
> 'データがない(strSubKeyが空の場合「ぬるぽ」発生)ので何もしない
> End Try

> あのページのほうも後で直しておきます...

こちらのほうも読ませていただきました。
実は、この手のエラーにはけっこう悩まされていて、たっぷり時間を浪費させられていました。
分かってきた気がします。
鳩丸倶楽部のホームページのほうは、今まで知りませんでした。
今後、参考にさせていただきます。 ありがとうございました。 kage
解決済み!

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