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

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

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

Re[9]: セットアップから別インストーラを実装するには


(過去ログ 79 を表示中)

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

■47083 / inTopicNo.1)  セットアップから別インストーラを実装するには
  
□投稿者/ hs (178回)-(2010/02/18(Thu) 10:07:16)

分類:[VB.NET/VB2005 以降] 

VS2008 professional VB

いつもお世話になっております。
現在セットアップを作成しているのですが、以下の様なことは可能でしょうか?

セットアップから実行する際、必須コンポーネントはもちろんですが、プロジェクトのリソースに [外部アプリ.exe] [外部アプリ.msi] のインストーラを格納しておき作成したセットアップのインストール実行時にそのインストーラを起動する。
また、そのインストーラはキャンセルする事が可能なので、アプリケーション内にメニューを設置しそのメニューからでも [外部アプリ.exe] [外部アプリ.msi] のインストーラを起動させる事。

内容が分かりづらいと思いますが、よろしくお願いします。

引用返信 編集キー/
■47088 / inTopicNo.2)  Re[1]: セットアップから別インストーラを実装するには
□投稿者/ とっちゃん (472回)-(2010/02/18(Thu) 11:16:13)
とっちゃん さんの Web サイト
No47083 (hs さん) に返信

> セットアップから実行する際、必須コンポーネントはもちろんですが、プロジェクトのリソースに [外部アプリ.exe] [外部アプリ.msi] のインストーラを格納しておき作成したセットアップのインストール実行時にそのインストーラを起動する。

実現の可否だけであれば多分可能です。

> また、そのインストーラはキャンセルする事が可能なので、アプリケーション内にメニューを設置しそのメニューからでも [外部アプリ.exe] [外部アプリ.msi] のインストーラを起動させる事。
>
こちらは、その外部アプリ.exe が実行できればいいだけですか?
それとも、この外部アプリ.msi を実行したいのでしょうか?

後者の場合は、msiexec.exe を呼び出すか、MsiInstallProduct API(P/Invokeする必要がある)などを呼び出すことになります。
メニューから呼び出しても問題ありませんし、スタートメニューとかにリンクを用意しても問題はありません(VSセットアップでmsiexecを呼び出すリンクが作れるかは不明)。

インストーラから呼び出せるか?の部分については、msi の実行中に別のmsiは呼び出せないので
Windows Installer 4.5 で追加された Chain-Install を利用するか、インストーラの終了を待って
次の処理に行く段取りを行う独自EXEを経由するかのどちらかになります。
どちらを利用する場合でも、VSセットアップからはちょっと呼び出しはちょっと無理だと思いますけどね。

Chain-Install については
・Multiple-Package Installations
http://msdn.microsoft.com/en-us/library/bb736322(VS.85).aspx
をお読みください(機械翻訳でも十分読める文章です)。

引用返信 編集キー/
■47114 / inTopicNo.3)  Re[2]: セットアップから別インストーラを実装するには
□投稿者/ hs (179回)-(2010/02/18(Thu) 17:29:57)
No47088 (とっちゃん さん) に返信

>> プロジェクトのリソースに [外部アプリ.exe] [外部アプリ.msi] のインストーラを格納しておきアプリケーション内にメニューを設置しそのメニューか>> らでも [外部アプリ.exe] [外部アプ>> リ.msi] のインストーラを起動させる事
> 実現の可否だけであれば多分可能です。

今回はこの方法で実現出来ればと考えています。

> こちらは、その外部アプリ.exe が実行できればいいだけですか?
> それとも、この外部アプリ.msi を実行したいのでしょうか?

インストールを完了させるのではなく、単純に [外部アプリ.exe] [外部アプリ.msi] のインストーラを起動(開く)させたいだけです。
つまりインストールの実行はそのインストーラの操作に任せるということです。

あるサイトでShell関数を使った以下のコードが載っていました。

 Dim Ret As Long = Shell("ファイルパス", vbNormalFocus)

つまり "ファイルパス" = My.Resources.[外部アプリ.exe] や "ファイルパス" = My.Resources.[外部アプリ.msi] とすればよいと思うのですが、
色々は検索してみましたが、それらしきページが見当たりませんでした。
そもそも作成されたアプリの My.Resources にはパスというものは存在しているのでしょうか?

自分なりに考えられる事なので、的を得ていないかもですが、もしお分かりになれば、ご教授頂けると助かります。
よろしくお願いします。

引用返信 編集キー/
■47122 / inTopicNo.4)  Re[3]: セットアップから別インストーラを実装するには
□投稿者/ とっちゃん (473回)-(2010/02/18(Thu) 17:57:07)
とっちゃん さんの Web サイト
No47114 (hs さん) に返信
> つまり "ファイルパス" = My.Resources.[外部アプリ.exe] や "ファイルパス" = My.Resources.[外部アプリ.msi] とすればよいと思うのですが、
> 色々は検索してみましたが、それらしきページが見当たりませんでした。
> そもそも作成されたアプリの My.Resources にはパスというものは存在しているのでしょうか?
>
えーっと。。。リソース(形式不問)にある実行可能ファイルは一度どこかにファイルとして書き出さないと実行できません。
その部分はクリアできていると思っていたのですが。。。その部分も出来ていない?

リソースではなくすでにファイルとして用意されている状況であれば実行は出来ていますか?

どこまでできていてどこができていないのか。
何がわかっていて何がわからないのかを伝えられていないので
周りからみると何がやりたいのかよくわからないけど。。。となっています。

引用返信 編集キー/
■47123 / inTopicNo.5)  Re[2]: セットアップから別インストーラを実装するには
□投稿者/ 渋木宏明(ひどり) (1282回)-(2010/02/18(Thu) 18:01:47)
渋木宏明(ひどり) さんの Web サイト
>>セットアップから実行する際、必須コンポーネントはもちろんですが、プロジェクトのリソースに [外部アプリ.exe] [外部アプリ.msi] のインストーラを格納しておき作成したセットアップのインストール実行時にそのインストーラを起動する。
>
> 実現の可否だけであれば多分可能です。

セットアップ実行中って、他のインストーラ起動すると怒られるんじゃない?
引用返信 編集キー/
■47128 / inTopicNo.6)  Re[4]: セットアップから別インストーラを実装するには
□投稿者/ hs (180回)-(2010/02/18(Thu) 18:28:33)
No47122 (とっちゃん さん) に返信

> えーっと。。。リソース(形式不問)にある実行可能ファイルは一度どこかにファイルとして書き出さないと実行できません。

仮にデスクトップに My.Resources.[外部アプリ.msi] My.Resources.[外部アプリ.exe] をコピーする場合、
IO.File.Copy(My.Resources.[外部アプリmsi]のパス,"C:\Users\ユーザー名\Desktop\外部アプリ.msi")
IO.File.Copy(My.Resources.[外部アプリexe]のパス,"C:\Users\ユーザー名\Desktop\外部アプリ.exe")
としないとコピーはできません。

ですので先ほど、
> そもそも作成されたアプリの My.Resources にはパスというものは存在しているのでしょうか?
という言い方になってしまいました。


> その部分はクリアできていると思っていたのですが。。。その部分も出来ていない?

こちらも、デスクトップに配置してみて以下を実行
Dim Ret As Long = Shell("C:\Users\ユーザー名\Desktop\外部アプリ.msi", vbNormalFocus)
Dim Ret As Long = Shell("C:\Users\ユーザー名\Desktop\外部アプリ.exe", vbNormalFocus)
とした場合、どちらも起動は確認できています。

上記2つの場合、どちらもMy.Resourcesのフルパスさえ取得できればよいのですが、
作成したアプリをインストールしProgramFileに専用のフォルダの中身をみても
・コンポーネントの.dllファイル
・アプリの.exeファイル
・アプリの.icoファイル
・アプリの.configファイル
しかありません。

> 周りからみると何がやりたいのかよくわからないけど。。。となっています。
こちらも、表現の仕方が下手で申し訳ありません。
やりたい事、プロジェクト内に [外部アプリ.msi].[外部アプリ.exe] をどこかに格納しておき、アプリからこれらをShell関数を使って起動させたい。
表現がこれ以上思い当たりません。

今回はたまたまリソースに [外部アプリ.msi].[外部アプリ.exe] を格納しましたが、そもそも [外部アプリ.msi].[外部アプリ.exe] 等の実行可能ファイルはプロジェクトのどこかに格納していてもそれをアプリ以外で操作することは出来ないのでしょうか?


引用返信 編集キー/
■47130 / inTopicNo.7)  Re[3]: セットアップから別インストーラを実装するには
□投稿者/ hs (181回)-(2010/02/18(Thu) 18:38:19)
訂正

>今回はたまたまリソースに [外部アプリ.msi].[外部アプリ.exe] を格納しましたが、そもそも [外部アプリ.msi].[外部アプリ.exe] 等の実行可能ファイル>はプロジェクトのどこかに格納していてもそれをアプリ以外で操作することは出来ないのでしょうか?

今回はたまたまリソースに [外部アプリ.msi].[外部アプリ.exe] を格納しましたが、
Me.BackgroundImage = My.Resources.イメージ
のように
Dim Ret As Long = Shell(My.Resources.外部アプリ.exe", vbNormalFocus)
みたいに実行可能ファイルを操作することは出来ないでしょうか?
引用返信 編集キー/
■47132 / inTopicNo.8)  Re[3]: セットアップから別インストーラを実装するには
□投稿者/ とっちゃん (474回)-(2010/02/18(Thu) 18:55:43)
とっちゃん さんの Web サイト
No47123 (渋木宏明(ひどり) さん) に返信
> >>セットアップから実行する際、必須コンポーネントはもちろんですが、プロジェクトのリソースに [外部アプリ.exe] [外部アプリ.msi] のインストーラを格納しておき作成したセットアップのインストール実行時にそのインストーラを起動する。
>>
>>実現の可否だけであれば多分可能です。
>
> セットアップ実行中って、他のインストーラ起動すると怒られるんじゃない?

なので、Chain-Install(4.5以上)で連続実行ですね。
引用返信 編集キー/
■47133 / inTopicNo.9)  Re[5]: セットアップから別インストーラを実装するには
□投稿者/ 渋木宏明(ひどり) (1283回)-(2010/02/18(Thu) 18:56:53)
渋木宏明(ひどり) さんの Web サイト
> やりたい事、プロジェクト内に [外部アプリ.msi].[外部アプリ.exe] をどこかに格納しておき、アプリからこれらをShell関数を使って起動させたい。
> 表現がこれ以上思い当たりません。

ほんとにそれだけなんです?
だとすると、スレタイ間違ってると思う。

引用返信 編集キー/
■47134 / inTopicNo.10)  Re[4]: セットアップから別インストーラを実装するには
□投稿者/ とっちゃん (475回)-(2010/02/18(Thu) 19:00:04)
とっちゃん さんの Web サイト
No47130 (hs さん) に返信
> 訂正
>
> >今回はたまたまリソースに [外部アプリ.msi].[外部アプリ.exe] を格納しましたが、そもそも [外部アプリ.msi].[外部アプリ.exe] 等の実行可能ファイル>はプロジェクトのどこかに格納していてもそれをアプリ以外で操作することは出来ないのでしょうか?
>
> 今回はたまたまリソースに [外部アプリ.msi].[外部アプリ.exe] を格納しましたが、
> Me.BackgroundImage = My.Resources.イメージ
> のように
> Dim Ret As Long = Shell(My.Resources.外部アプリ.exe", vbNormalFocus)
> みたいに実行可能ファイルを操作することは出来ないでしょうか?

リソースに埋め込まれたものを実行可能ファイルとして利用することはできないと思います。
なので、テンポラリフォルダなりに一度出力してそれを実行するなどが必要かと。

リソースに入れておかなければならないなどがないのであれば、別途ファイルを直接指定するなどで
インストーラに組み込むことは可能です。

引用返信 編集キー/
■47136 / inTopicNo.11)  Re[5]: セットアップから別インストーラを実装するには
□投稿者/ 魔界の仮面弁士 (1497回)-(2010/02/18(Thu) 19:15:24)
No47128 (hs さん) に返信
> 仮にデスクトップに My.Resources.[外部アプリ.msi] My.Resources.[外部アプリ.exe] をコピーする場合、
> IO.File.Copy(My.Resources.[外部アプリmsi]のパス,"C:\Users\ユーザー名\Desktop\外部アプリ.msi")
> IO.File.Copy(My.Resources.[外部アプリexe]のパス,"C:\Users\ユーザー名\Desktop\外部アプリ.exe")
> としないとコピーはできません。

『My.Resources.[外部アプリexe]のパス』が何を返すのか、にもよりますが:

My.Resources.外部アプリexe が、exe ファイルの「バイナリ」を返すのであれば、
それを File.WriteAllBytes でファイルとして吐き出せるかと思います。

My.Resources.外部アプリexe が、exe ファイルの場所を示している場合、
それが URL であれば、いったんダウンロードさせる必要がありますし、
それがローカルHDD 上のパスであれば、それをそのまま利用できるかと。


> やりたい事、プロジェクト内に [外部アプリ.msi].[外部アプリ.exe] をどこかに格納しておき、アプリからこれらをShell関数を使って起動させたい。

今回の要件を満たせるかどうかは別として……それが .NET なアセンブリであれば、モノによっては
バイナリデータを直接実行できる可能性があります。起動手順が Shell では無くなってしまいますが。

Imports System.Reflection
Module Module1
    Sub Main()
        Dim bin() As Byte = My.Resources.EXEファイルのバイナリ
        Dim r As Assembly = Assembly.Load(bin, Nothing)
        r.EntryPoint.Invoke(r, BindingFlags.Default, Nothing, Nothing, Nothing)
    End Sub
End Module


# bin の内容:以下のコンソールアプリの EXE
---------
using System;
class a{static void Main(){
  decimal[] x = {1.0M, 1.00m, Decimal.Parse("1.000") };
  Array.ForEach(x, Console.WriteLine);
}}
---------

引用返信 編集キー/
■47137 / inTopicNo.12)  Re[4]: セットアップから別インストーラを実装するには
□投稿者/ たか (29回)-(2010/02/18(Thu) 20:46:40)
かなりトピが白熱してましたね。

おかげで私の問題も解決しました。

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


解決済み
引用返信 編集キー/
■47141 / inTopicNo.13)  Re[5]: セットアップから別インストーラを実装するには
□投稿者/ hs (182回)-(2010/02/18(Thu) 21:29:07)
No47137 (たか さん) に返信


トピ違いです。
引用返信 編集キー/
■47151 / inTopicNo.14)  Re[6]: セットアップから別インストーラを実装するには
□投稿者/ hs (183回)-(2010/02/19(Fri) 10:56:35)
No.47122 (とっちゃん さん) に返信

先ほど以下の内容から、セットアップのアプリケーションフォルダに [外部アプリ.msi][外部アプリ.exe] を追加し
作成したアプリをインストール後、簡単にユーザーのProgram Files内に配置する事ができました。
> えーっと。。。リソース(形式不問)にある実行可能ファイルは一度どこかにファイルとして書き出さないと実行できません。

今回は、アプリに配置したメニューからでも [外部アプリ.msi][外部アプリ.exe] を起動出来る仕様とするためインストールしたPC内に配置しておく事が必要でした。 それを My.Resources 内に格納しておけば簡単に使えるものだと思っておりました。



■ (魔界の仮面弁士 さん) に返信

いつもありがとうございます。
せっかくコードまで載せて頂いたのですが、上記のように今回は My.Resources 内のファイルを使う事ばかりがりが前面に出てしまいました。



以下のコードでりやりたい事が実現出来ました。

'.exeインストーラーの起動
Dim Ret As Long = Shell(My.Application.Info.DirectoryPath & "\○○○.exe", vbNormalFocus)

'.msiインストーラーの起動
Dim Ret As Long = Shell("C:\Windows\System32\msiexec.exe /i " & My.Application.Info.DirectoryPath & "\○○○.msi", vbNormalFocus)

また何かあった時はよろしくお願いします。

解決済み
引用返信 編集キー/
■47153 / inTopicNo.15)  Re[7]: セットアップから別インストーラを実装するには
□投稿者/ とっちゃん (476回)-(2010/02/19(Fri) 12:14:48)
とっちゃん さんの Web サイト
No47151 (hs さん) に返信
> 以下のコードでりやりたい事が実現出来ました。
>
> '.exeインストーラーの起動
> Dim Ret As Long = Shell(My.Application.Info.DirectoryPath & "\○○○.exe", vbNormalFocus)
>
> '.msiインストーラーの起動
> Dim Ret As Long = Shell("C:\Windows\System32\msiexec.exe /i " & My.Application.Info.DirectoryPath & "\○○○.msi", vbNormalFocus)
>
ファイルのフルパス生成は、
System.IO.Path クラスの Combine メソッドを使うと、いろいろ面倒なことを考えなくて済みます。
普段からそれを心がけているほうがよいかと。。。

#解決済み付いてるので一応つけたまま
解決済み
引用返信 編集キー/
■47154 / inTopicNo.16)  Re[7]: セットアップから別インストーラを実装するには
□投稿者/ 魔界の仮面弁士 (1499回)-(2010/02/19(Fri) 12:28:50)
No47151 (hs さん) に返信
> Dim Ret As Long = Shell(My.Application.Info.DirectoryPath & "\○○○.exe", vbNormalFocus)
Shell 関数の戻り値は、(Long ではなく) Integer 型です。

それと、アプリがもしもルートに配置されていた場合、My.Application.Info.DirectoryPath は
「C:\」のように末尾に "\" のついたパスを返します。その場合、上記は
「C:\○○○.exe」ではなく、「C:\\○○○.exe」になりますので、ご注意ください。

できれば、System.IO.Path.Combine メソッドで結合するようにした方が良いかと。

> Dim Ret As Long = Shell("C:\Windows\System32\msiexec.exe /i " & My.Application.Info.DirectoryPath & "\○○○.msi", vbNormalFocus)
OS のインストールフォルダは、"C:\Windows" とは限りませんよ。
解決済み
引用返信 編集キー/
■47162 / inTopicNo.17)  Re[8]: セットアップから別インストーラを実装するには
□投稿者/ hs (184回)-(2010/02/19(Fri) 14:46:34)
No47153 (とっちゃん さん) に返信
No47154 (魔界の仮面弁士 さん) に返信

貴重な回答ありがとうございます。
今までPathの連結は My.Application.Info.DirectoryPath & "\○○○.exe" のようにいちいち \ を結合していました。
今後は、System.IO.Path.Combine で行うようにします。

> OS のインストールフォルダは、"C:\Windows" とは限りませんよ。
おっしゃる通りですね;
まだまだ考えないといけない事がありそうです...

また何かあった時はよろしくお願いします。
引用返信 編集キー/
■47164 / inTopicNo.18)  Re[9]: セットアップから別インストーラを実装するには
□投稿者/ とっちゃん (478回)-(2010/02/19(Fri) 15:05:00)
とっちゃん さんの Web サイト
No47162 (hs さん) に返信
>>OS のインストールフォルダは、"C:\Windows" とは限りませんよ。
> おっしゃる通りですね;

んと。。。System32 ディレクトリも、...\System32 とは限りません。
Windows のデスクトップ系OS(サーバーを含む)で本当にできるのかどうかは知りませんが
NT 3.1 の当時よりシステムディレクトリは、決め打ちするなとドキュメントに書かれています。

なので、System.Environment.SystemDirectory プロパティでパスを取得します。
Enviroment.GetFolderPath でもOKですが、ここは固定(環境に影響しない)ので、SystemDirectory プロパティで十分かな。

最終的には、
Shell( System.IO.Path.Combine( System.Environment.SystemDirectory, "msiexec.exe" ) & " /I " & System.IO.Path.Combine( My.Appication.Info.DirectoryPath, "○○○.msi" ), vbNormalForcus )
といった感じになると思います。

でも、パラメータも何もいらないなら
System.Diagnostics.Process.Start( System.IO.Path.Combine( My.Appication.Info.DirectoryPath, "○○○.msi" ) )
でも問題ない気がします。たしかShellExecute してくれるんですよね?<Process.Start


ちなみに Windows ディレクトリ(c:\Windowsに相当する場所)は、なぜか見当たりませんでした<Enviromnmentクラス
ほかのところにあるのか、それとも .NET Framework じゃめったなことじゃ利用しないのか...
その辺はよくわかりませんが。API なら GetWindowsDirectory でサクッととれるんですけどねw

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -