C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[20]: ランタイムパッケージインストール済みチェック方法


(過去ログ 28 を表示中)

[トピック内 28 記事 (1 - 20 表示)]  << 0 | 1 >>

■12998 / inTopicNo.1)  ランタイムパッケージインストール済みチェック方法
  
□投稿者/ セイン (43回)-(2008/01/23(Wed) 12:08:23)

分類:[.NET 全般] 

以前はありがとうございました。

このたび、Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (x86)が
インストール済みかどうかをチェックするソフトを、
Win32プロジェクト(C++)で作成することになりました。
(MFCを使ってしまうと、ランタイムが入っていないので動かなくなるため)

上記ソフトのインストール済みチェック方法をご存知の方いらっしゃれば教えてください。

よろしくお願いします。

引用返信 編集キー/
■12999 / inTopicNo.2)  Re[1]: ランタイムパッケージインストール済みチェック方法
□投稿者/ やじゅ (25回)-(2008/01/23(Wed) 12:48:50)
No12998 (セイン さん) に返信
> このたび、Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (x86)が
> インストール済みかどうかをチェックするソフトを、
>

ちょっと違うかな、参考程度に・・・
Visual Studio 2005 に SP1 が適用されているかどうか判断するには?
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1529359&SiteID=7
引用返信 編集キー/
■13000 / inTopicNo.3)  Re[1]: ランタイムパッケージインストール済みチェック方法
□投稿者/ とっちゃん (224回)-(2008/01/23(Wed) 13:11:22)
とっちゃん さんの Web サイト
No12998 (セイン さん) に返信

> このたび、Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (x86)が
> インストール済みかどうかをチェックするソフトを、
> Win32プロジェクト(C++)で作成することになりました。
> (MFCを使ってしまうと、ランタイムが入っていないので動かなくなるため)
>
> 上記ソフトのインストール済みチェック方法をご存知の方いらっしゃれば教えてください。
>
いくつかパターンがあるのですが...
方法としては
「再頒布可能パッケージ」そのもののインストールを確認したいのか
それとも、
SP1対応版のMSVCR80.DLL(ほか)がインストールされているかを確認したいのか
というところは重要ですね。
前者の場合、そのマシンのオーナー(要するにエンドユーザー)が自分で選んでアンインストールしない限り残っていますが
後者の場合は、入れたソフトのアンインストールとともに消えてしまう可能性もあります。

ま、「ふつうは」そういうことを考慮しなくてもいいように、インストーラを作るわけですけど...w

ちなみに前者であれば、「再頒布可能パッケージ」がインストールされているかを公式に判断する方法としては
MsiQueryProductState API を使って判断するというのが正しいやり方となります。

判断方法は、
if( MsiQueryProductState( _T("{7299052b-02a4-4627-81f2-1818da5d550d}") ) >= INSTALLSTATE_ABSENT )
{
 // インストール済み
}
です。
ちなみに、VS2005(Not Express) にSP1をあてた環境だと、Product.xml の判断方法が間違っています。
#これを書きながら確認

対策方法は、product.xml の {A49F249F-0C91-497F-86DF-B2585E8E76B7} と書かれているところを
上記の {7299...} に変更するという形になります。

これ、フィードバックしないとまずいな。
#ショーストッパーものの致命的なバグなんだけどなぁ...おいらにとってはw

引用返信 編集キー/
■13002 / inTopicNo.4)  Re[2]: ランタイムパッケージインストール済みチェック方法
□投稿者/ とっちゃん (226回)-(2008/01/23(Wed) 13:33:23)
とっちゃん さんの Web サイト
No13000 (とっちゃん さん) に返信

後者の扱いを書いていなかったので追記w

えっと、入ってるかどうかわからない環境へインストールしたいのなら、ちゃんとインストーラを作って(VSセットアッププロジェクトでよい)、
msm でランタイムを添付すれば、何の問題もないと思いますよ。

それならチェックルーチンもいらないし...w

ま、vcregist_x86 を無条件に実行しても、入ってれば何もしないと思うので、それはそれで問題ないんでしょうけど...


引用返信 編集キー/
■13003 / inTopicNo.5)  Re[2]: ランタイムパッケージインストール済みチェック方法
□投稿者/ セイン (44回)-(2008/01/23(Wed) 13:34:50)
やじゅ様 とっちゃん様ありがとうございます。

今回やりたいのは、VisualStudio2005で作成したアプリのインストーラーの作成です。

.NETFrameworkVersion 2.0 と Microsoft Visual C++ 2005 SP1 適用済みでないと
動かないアプリなので、 事前にチェックをしてインストールしたのち、
本アプリをインストールすることが狙いです。


ですので、とっちゃん様がおっしゃるとおり、「再頒布可能パッケージ」そのもののインストールを確認したいというわけではなく、
SP1が適用済みで、 作成したアプリが動作する環境にあるかどうかをチェックすることが目的です。

そういう動きをさせたいのであれば、
判断方法は、
>if( MsiQueryProductState( _T("{7299052b-02a4-4627-81f2-1818da5d550d}") ) >= >INSTALLSTATE_ABSENT )
>{
> // インストール済み
>}
このやり方ではまずい?ということになるのでしょうか?
ご教授願います。



引用返信 編集キー/
■13004 / inTopicNo.6)  Re[3]: ランタイムパッケージインストール済みチェック方法
□投稿者/ セイン (45回)-(2008/01/23(Wed) 13:40:18)
セットアッププロジェクトの必要コンポーネント画面を表示して、
Visual C++ ランタイムライブラリ(x86)にチェックを入れて、
必要コンポーネントのインストール場所を。
アプリケーションと同じ場所から必須コンポーネントをダウンロードするに
チェックを入れて、再配布パッケージをソリューションに含めたらOK?


引用返信 編集キー/
■13006 / inTopicNo.7)  Re[4]: ランタイムパッケージインストール済みチェック方法
□投稿者/ とっちゃん (227回)-(2008/01/23(Wed) 14:23:52)
とっちゃん さんの Web サイト
No13004 (セイン さん) に返信
> セットアッププロジェクトの必要コンポーネント画面を表示して、
> Visual C++ ランタイムライブラリ(x86)にチェックを入れて、
> 必要コンポーネントのインストール場所を。
> アプリケーションと同じ場所から必須コンポーネントをダウンロードするに
> チェックを入れて、再配布パッケージをソリューションに含めたらOK?
>
段取りとしてはこれでOKです。
ただし、やる前に product.xml の修正が必要。
最初に書いたあと、MSDNフォーラムにもフィードバック入れてますが、product.xml の内容がSPなし版のままなんですよね。
なので、意味もなくvcregist_x86 が毎回呼ばれてしまうことになる。

インストーラを作るのであれば、.NET Framework のランタイムは必須コンポーネントで、
VCのランタイム類は、msm(マージモジュール)でというのが段取りとしてはお勧めです。
MFCを使ってるのならMFCも入れられるし、本当の意味で必要なものだけリストアップしてくれますので。

.NET Framework は必須コンポーネントしか選択肢がないのでどうにもなりませんが...

引用返信 編集キー/
■13019 / inTopicNo.8)  Re[5]: ランタイムパッケージインストール済みチェック方法
□投稿者/ セイン (46回)-(2008/01/23(Wed) 15:08:56)
すいません。
やはり方針として、インストールするソフトの一覧を先に表示し、インストールしたいため、
今現在ランタイムのSP1がインストールされているかを調べる方法が知りたいです。

調べる方法はあるのでしょうか?
下の方法でよいのですよね?
>if( MsiQueryProductState( _T("{7299052b-02a4-4627-81f2-1818da5d550d}") ) >= >INSTALLSTATE_ABSENT )
>{
> // インストール済み
>}

すいません→product.xml を探してみたのですが、どのファイルのことなのでしょうか?
お願いします。


引用返信 編集キー/
■13030 / inTopicNo.9)  Re[6]: ランタイムパッケージインストール済みチェック方法
□投稿者/ とっちゃん (228回)-(2008/01/23(Wed) 16:42:50)
とっちゃん さんの Web サイト
No13019 (セイン さん) に返信

> 調べる方法はあるのでしょうか?
> 下の方法でよいのですよね?
> >if( MsiQueryProductState( _T("{7299052b-02a4-4627-81f2-1818da5d550d}") ) >= >INSTALLSTATE_ABSENT )
> >{
> > // インストール済み
> >}
>
はい。これで行けます。
「ただし」VS2005 でモジュールを作っているのであれば、別途 WindowsSDK か、PlatformSDK(どっちを入れてもよい)が必要です。
なぜかって?x86用のmsi.libがないから...
#VS2008なら入ってるんですけどね...orz

WindowsInstaller のAPIを使う場合や、Custom Actions(.NET FrameworkのInstallerクラスを使うカスタム動作ではありません)を利用する場合は、必ずSDKを別途入れないとだめなんですよね...


> すいません→product.xml を探してみたのですが、どのファイルのことなのでしょうか?
> お願いします。
>
おいらの環境(VS2005でインストール先を変えずに入れた環境)では
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86\product.xml
になります。
ただし、このパスはおいらの環境なので、Microsoft Visual Studio 8 の部分までは違う可能性はあります。
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages
のサブフォルダ(フォルダごとにproduct.xmlがあります)にあるものがそのまま
必須コンポーネントの個々のエントリーになります。

ちなみに、VS2008では C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages
ですね(これもおいらの環境の場合ですけどねw)。

引用返信 編集キー/
■13031 / inTopicNo.10)  Re[7]: ランタイムパッケージインストール済みチェック方法
□投稿者/ とっちゃん (229回)-(2008/01/23(Wed) 16:45:07)
とっちゃん さんの Web サイト
No13030 (とっちゃん さん) に返信

書き忘れ。

上記APIを使う場合は、msi.h のinclude が必要です。
また、LoadLibraryしない場合は、msi.libも必要です(こちらのために別途SDKが必要...)。

また、SDKのパスが正しく設定されていない場合はリンクエラーが出るのでその点も注意が必要です。

引用返信 編集キー/
■13046 / inTopicNo.11)  Re[8]: ランタイムパッケージインストール済みチェック方法
□投稿者/ セイン (47回)-(2008/01/23(Wed) 20:46:41)
2008/01/23(Wed) 21:01:53 編集(投稿者)

とっちゃん様

まるで僕の動きが見えているかのフォローありがとうございますw

>上記APIを使う場合は、msi.h のinclude が必要です。
ご指摘のとおり探してインクルードしました^^

>また、LoadLibraryしない場合は、msi.libも必要です(こちらのために別途SDKが必要...)。
こちらもインクルードしました。
僕の環境では下記
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib\AMD64\Msi.Lib

>また、SDKのパスが正しく設定されていない場合はリンクエラーが出るのでその点も注意が必要です。
ここで詰まっています。。。

外部シンボル "__imp__MessageBoxA@16" は未解決です。
外部シンボル "__imp__ShellExecuteA@24" は未解決です。
外部シンボル "__imp__LoadIconA@8" は未解決です。
外部シンボル "__imp__LoadCursorA@8" は未解決です。
外部シンボル "__imp__RegisterClassExA@4" は未解決です。

このようなエラーが複数発生し、コンパイルが通りません。
自分でいろいろ調べたのですが、わかりませんでした。
どうすればよろしいでしょうか?



追記
AMD64の下を参照しようとしていますが、僕のマシーンは64ビットではないので、
これに問題があるのでしょうか?

C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib
このディレクトリの下にmsi.libがいないので、どうすればいいか悩んでおります。




引用返信 編集キー/
■13053 / inTopicNo.12)  Re[9]: ランタイムパッケージインストール済みチェック方法
□投稿者/ やじゅ (26回)-(2008/01/23(Wed) 22:19:29)
やじゅ さんの Web サイト
No13046 (セイン さん) に返信
> 2008/01/23(Wed) 21:01:53 編集(投稿者)
>> >また、LoadLibraryしない場合は、msi.libも必要です(こちらのために別途SDKが必要...)。
> こちらもインクルードしました。
> 僕の環境では下記
> C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib\AMD64\Msi.Lib
>
> 追記
> AMD64の下を参照しようとしていますが、僕のマシーンは64ビットではないので、
> これに問題があるのでしょうか?
>

Visual Studio 2005 シリーズには msi.lib がありません。
http://blogs.wankuma.com/tocchann/archive/2006/05/17/25243.aspx
x64/IA64 用はあるんですがね。肝心の x86 用が欠落しています。
別途 PlatformSDK をインストールすることで導入できますので、そちらを利用してください。
引用返信 編集キー/
■13096 / inTopicNo.13)  Re[10]: ランタイムパッケージインストール済みチェック方法
□投稿者/ とっちゃん (230回)-(2008/01/24(Thu) 12:14:01)
とっちゃん さんの Web サイト
No13053 (やじゅ さん) に返信

フォローありがとうございます。
13030 でも書いたんですが、テメーの記事もリンクしておくべきだった...orz

ちなみに、PlatformSDK(WindowsSDKではない)をVS2005にバインドする方法は
http://blogs.wankuma.com/tocchann/archive/2006/05/18/25272.aspx
に書いてあります。

記事での対象が Express になっていますが、作業そのものは何ら変わりありません。

引用返信 編集キー/
■13097 / inTopicNo.14)  Re[11]: ランタイムパッケージインストール済みチェック方法
□投稿者/ セイン (49回)-(2008/01/24(Thu) 12:27:14)
2008/01/24(Thu) 12:29:12 編集(投稿者)

とっちゃん さん やじゅ さん ありがとう^^

無事再配布インストール済みチェックができました。ありがとう。
ダウンロードし、インストールすると、下記のディレクトリができたので、
追加のインクルードファイルと、ライブラリに追加して、実行しました。
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib

しかし、.NET2005がインストール済みで、再配布版ランタイムインストールが
必要のないPCの環境の場合でも、再配布版が入っていない!といわれてしまいます。

両方をチェックし、双方が未インストールなら、再配布版を入れるようにしたいのですが、
そういった方法でよいものでしょうか?

もし上記の方法でOKであれば、.NET2005がインストール済みかどうか調べる方法を教えてください。

よろしくお願いします。


No13096 (とっちゃん さん) に返信
> ■No13053 (やじゅ さん) に返信
>
> フォローありがとうございます。
> 13030 でも書いたんですが、テメーの記事もリンクしておくべきだった...orz
>
> ちなみに、PlatformSDK(WindowsSDKではない)をVS2005にバインドする方法は
> http://blogs.wankuma.com/tocchann/archive/2006/05/18/25272.aspx
> に書いてあります。
>
> 記事での対象が Express になっていますが、作業そのものは何ら変わりありません。
>
引用返信 編集キー/
■13110 / inTopicNo.15)  Re[12]: ランタイムパッケージインストール済みチェック方法
□投稿者/ とっちゃん (231回)-(2008/01/24(Thu) 15:14:44)
とっちゃん さんの Web サイト
No13097 (セイン さん) に返信

> しかし、.NET2005がインストール済みで、再配布版ランタイムインストールが
> 必要のないPCの環境の場合でも、再配布版が入っていない!といわれてしまいます。
>
.NET 2005 というのは、Visual Studio 2005 のことでしょうか?
それとも、.NET Framework 2.0 ランタイムのことでしょうか?

前者の場合、VC++ ランタイムが必要ないのは、VS2005(Expressの場合は、C++のみ対象)に
SP1が適用されている場合のみ、ランタイムのインストールを省くことが可能となります。

後者の場合は、.NET Framework 2.0 のランタイムには C/C++ のランタイムは含まれていないので
別途インストールが必要となります。
なので、動作としては問題はない。ということになると。

> もし上記の方法でOKであれば、.NET2005がインストール済みかどうか調べる方法を教えてください。
>
前者の側ということになると思うので、そちらで考えてみました。

一応ちゃんとした対応方法はあると思いますが、まじめに調査したことがないので
とりあえず...という方法です。

一般的にはレジストリの
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Setup]
キーにある情報で、ある程度以上のことはわかると思います。
ただ、ここをちょっとのぞいた限りでは、SP1が適用されているかどうかなどは
わからないみたいなんですよね。

なので、ほかのところもいろいろ調査しないとだめかもしれません。

もしかすると、地道にレジストリをチェックするなどという泥臭い方法をとらずとも
SDK(Visual Studio にもSDKがあります)のドキュメントに何かのってるかも
というのはありますが。
自分では持っていないので、このあたりは調査したことがありませんのでわかりません。

VS2005からは、登録すれば個人でもDLできたはずですので、一度MSのサイトを
探してみるとよいと思います。

引用返信 編集キー/
■13115 / inTopicNo.16)  Re[13]: ランタイムパッケージインストール済みチェック方法
□投稿者/ セイン (50回)-(2008/01/24(Thu) 17:26:34)
No13110 (とっちゃん さん) に返信
ありがとうございます。

お察しのとおり、前者側でした。
Visual Studio 2005 SP1の環境で動くはずのアプリにもかかわらず、
ランタイムパッケージのインストールを要求してくる不思議なインストーラーに
現在なっています。

ここから先は自分でもう少し調べてみようと思います。
何か方法があれば、追記したいと思います。

皆さんありがとうございました。


> ■No13097 (セイン さん) に返信
>
>>しかし、.NET2005がインストール済みで、再配布版ランタイムインストールが
>>必要のないPCの環境の場合でも、再配布版が入っていない!といわれてしまいます。
>>
> .NET 2005 というのは、Visual Studio 2005 のことでしょうか?
> それとも、.NET Framework 2.0 ランタイムのことでしょうか?
>
> 前者の場合、VC++ ランタイムが必要ないのは、VS2005(Expressの場合は、C++のみ対象)に
> SP1が適用されている場合のみ、ランタイムのインストールを省くことが可能となります。
>
> 後者の場合は、.NET Framework 2.0 のランタイムには C/C++ のランタイムは含まれていないので
> 別途インストールが必要となります。
> なので、動作としては問題はない。ということになると。
>
>>もし上記の方法でOKであれば、.NET2005がインストール済みかどうか調べる方法を教えてください。
>>
> 前者の側ということになると思うので、そちらで考えてみました。
>
> 一応ちゃんとした対応方法はあると思いますが、まじめに調査したことがないので
> とりあえず...という方法です。
>
> 一般的にはレジストリの
> [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Setup]
> キーにある情報で、ある程度以上のことはわかると思います。
> ただ、ここをちょっとのぞいた限りでは、SP1が適用されているかどうかなどは
> わからないみたいなんですよね。
>
> なので、ほかのところもいろいろ調査しないとだめかもしれません。
>
> もしかすると、地道にレジストリをチェックするなどという泥臭い方法をとらずとも
> SDK(Visual Studio にもSDKがあります)のドキュメントに何かのってるかも
> というのはありますが。
> 自分では持っていないので、このあたりは調査したことがありませんのでわかりません。
>
> VS2005からは、登録すれば個人でもDLできたはずですので、一度MSのサイトを
> 探してみるとよいと思います。
>
解決済み
引用返信 編集キー/
■13116 / inTopicNo.17)  Re[14]: ランタイムパッケージインストール済みチェック方法
□投稿者/ とっちゃん (232回)-(2008/01/24(Thu) 18:22:52)
とっちゃん さんの Web サイト
No13115 (セイン さん) に返信
> Visual Studio 2005 SP1の環境で動くはずのアプリにもかかわらず、
> ランタイムパッケージのインストールを要求してくる不思議なインストーラーに
> 現在なっています。
>
> ここから先は自分でもう少し調べてみようと思います。
> 何か方法があれば、追記したいと思います。
>
んと、解決済みマークついちゃってるんですが...補足。

Visual Studio 2005 をインストールしても、vcregist_x86.exe はその環境では実行されていません。
コンパネのアプリケーションの追加と削除(OSにより表現は異なる)で確認してみればわかりますが、

VS2005をインストールしただけでは、vcregist_x86 は「インストールしていない状態」になっていますよ。

なので、状態としては別段おかしいわけではない。と言えます。
#ま、動作としては無駄に見えるわけですが...w

この辺のネタになってくると、SharedDLLカウンタだとか、WindowsInstaller Component Model だとかという
ちょっと込み入った話を持ってこないといけないのですがねw

解決済み
引用返信 編集キー/
■13122 / inTopicNo.18)  Re[15]: ランタイムパッケージインストール済みチェック方法
□投稿者/ セイン (51回)-(2008/01/24(Thu) 20:51:14)
おおお!
まさしくそれです!w

ありがとう^^
解決済み
引用返信 編集キー/
■13126 / inTopicNo.19)  Re[16]: ランタイムパッケージインストール済みチェック方法
□投稿者/ セイン (52回)-(2008/01/24(Thu) 21:30:48)
ごめんなさい!
下の関数が、製品のインストール状態を返す関数であることはわかりましたが、
第一引数をどこでしらべればいいのでしょうか?

ラインタイムパッケージ == 7299052b-02a4-4627-81f2-1818da5d550d ということの調べ方?



インテルのライブラリや.NET Framework 2.0のインストールチェックも下の関数でできるのであれば、
統一したいです!

if( MsiQueryProductState( _T("{7299052b-02a4-4627-81f2-1818da5d550d}") ) >= >INSTALLSTATE_ABSENT )
{
 // インストール済み
}



引用返信 編集キー/
■13133 / inTopicNo.20)  Re[17]: ランタイムパッケージインストール済みチェック方法
 
□投稿者/ やじゅ (35回)-(2008/01/24(Thu) 23:19:41)
やじゅ さんの Web サイト
No13126 (セイン さん) に返信
> ごめんなさい!
> 下の関数が、製品のインストール状態を返す関数であることはわかりましたが、
> 第一引数をどこでしらべればいいのでしょうか?
>
> ラインタイムパッケージ == 7299052b-02a4-4627-81f2-1818da5d550d ということの調べ方?
>

WMIを使って、msiファイルからプロダクトコード(IndentifyingNumber)を取得する
WMI: Find a product code from the product name
http://oka326.blogspot.com/2006/02/wmi-find-product-code-from-product.html
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -