none
Visual Studioアプリケーションのインストーラーについて RRS feed

  • 質問

  • Visual Studioでアプリケーションを作り、それにインストーラーを加えて、インストールパッケージを作成しようとしています。
    インストーラーは、InstallShieldとか、VSのセットアッププロジェクトとかがあるかと思いますが、インストーラーに要件があります。

    1.インストールフォルダをユーザーが変更しようとして、既定としたフォルダから変更ができる
    2.インストール中に、インストールしているOSを判別することができる
    3.インストール中に使用される一時ファイルの展開先を、あらかじめ指定できる (PCによって展開先の制約があるため)

    これらを満たすインストーラーを探しているのですが、ちょうどいいもの、近いものなどは、どのようなものがありますでしょうか?
    2009年6月4日 5:51

回答

  • InstallShieldやVSセットアッププロジェクトは、WindowsInstaller というOSのエンジンを利用しています。

    これを使っている場合、一時ファイル(何を指しているかわかりませんが)は、上書きコピーなどの退避ファイルとなるため、専用のフォルダに退避されます(このフォルダは指定できません)。それを除けば、一時ファイルは、%TEMP% になりますがこちらも変更は不可能となります。

    もし、一時ファイルが %TEMP% ではダメという場合、既存のインストーラアーキテクチャではおそらく対応は難しいのでは?と思います。

    もっとも、3の一時ファイルの展開先というのが何を指しているか?にもよるとは思いますが。

    1,2については、ClickOnce以外ならおそらく問題ないと思いますよ。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク masakiy 2009年6月5日 0:19
    • 回答としてマークされていない masakiy 2009年6月9日 8:26
    • 回答としてマーク sk7474 2009年6月18日 7:37
    2009年6月4日 8:40
  • InstallShield 2009 は持っていないので、わかりません。お役に立てず申し訳ないです。

    ですが、InstallScript ということは、WindowsInstaller のエンジンではなく独自形式ということになります(古い製品などのメンテナンス向けに今も残っていると開発元が表明しちゃってるような代物もなので、新規開発では使わないことをお勧め)。

    ヘルプの内容からはちょっと推し量れないものまりますが、GetTempFileNameIS は、何らかの理由でフォルダがなかったらフォルダを作って返してくるというように読めます。
    #関数宣言がわからんので何とも言えませんがね。

    もし、InstallShield でということであればここで聞いても回答を得られる可能性はかなり低いので(全く関係ない製品ですし)、ISのユーザーコミュニティ(ML)で聞いたほうがよいと思いますよ。

    何かしらの回答がつくという保証は全くありませんが、ここよりは多少なりとも回答が得られる確率は高いのではないか?と思います。
    http://groups.yahoo.co.jp/group/is-user/ が、ISのユーザーコミュニティのトップとなります。

    一度のぞいてみてもいいかもしれません。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク sk7474 2009年6月18日 7:37
    2009年6月9日 8:42
  • IS2009は持ってませんが、気になったのでググってみました。
    http://helpnet.acresso.com/robo/projects/installshield15langref/GetTempFileNameIS.htm
    これを読む限り、GetTempFileNameISの動作はとっちゃんさんの推察通りですね。
    オプションでファイル自体は消すとか、変わったこともできるみたいだけど。

    あとInstallScriptにこだわらないのであれば、独自DLLやJScriptなんかを用意して呼び出して何とかなるんじゃないでしょうか?<-古い知識しかありません。未確認です。
    確かInstallScriptも独自DLL上で処理されるはずなんで同じことですけど。
    それと、かなり古い知識でしかないですが、InstallScriptには展開先を示す共通変数(正式名称は覚えてない)みたいなのがあったと思います。

    でも、そもそも、その制約ってのが気になります。
    TEMPが無理なら他はもっと無理な気が・・・
    何が何でも展開先を変更したいのなら別ですが、制約を明らかにして別の方法を検討するのも手だと思いますよ。
    • 回答としてマーク sk7474 2009年6月18日 7:37
    2009年6月10日 1:17

すべての返信

  • InstallShieldやVSセットアッププロジェクトは、WindowsInstaller というOSのエンジンを利用しています。

    これを使っている場合、一時ファイル(何を指しているかわかりませんが)は、上書きコピーなどの退避ファイルとなるため、専用のフォルダに退避されます(このフォルダは指定できません)。それを除けば、一時ファイルは、%TEMP% になりますがこちらも変更は不可能となります。

    もし、一時ファイルが %TEMP% ではダメという場合、既存のインストーラアーキテクチャではおそらく対応は難しいのでは?と思います。

    もっとも、3の一時ファイルの展開先というのが何を指しているか?にもよるとは思いますが。

    1,2については、ClickOnce以外ならおそらく問題ないと思いますよ。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク masakiy 2009年6月5日 0:19
    • 回答としてマークされていない masakiy 2009年6月9日 8:26
    • 回答としてマーク sk7474 2009年6月18日 7:37
    2009年6月4日 8:40
  • 返答ありがとうございました。

    それで、InstallShieldのヘルプを見てみたのですが、バージョン2009からはできるようになった模様なのですが、いかがでしょうか?

    --------------
    GetTempFileNameIS
    InstallShield 2009 » InstallScript 言語リファレンス

    GetTempFileNameIS 関数は Windows API GetTempFileName を呼び出して一時ファイルを作成し、その関連アクションを実行します。Windows API GetTempFileName とは異なり、存在しないとき、GetTempFileNameIS は szPathName で指定されたフォルダを作成します。CreateDir 関数を使用するときと同様、新規作成されたフォルダはアンインストールではログ記録されません。
    2009年6月9日 8:29
  • InstallShield 2009 は持っていないので、わかりません。お役に立てず申し訳ないです。

    ですが、InstallScript ということは、WindowsInstaller のエンジンではなく独自形式ということになります(古い製品などのメンテナンス向けに今も残っていると開発元が表明しちゃってるような代物もなので、新規開発では使わないことをお勧め)。

    ヘルプの内容からはちょっと推し量れないものまりますが、GetTempFileNameIS は、何らかの理由でフォルダがなかったらフォルダを作って返してくるというように読めます。
    #関数宣言がわからんので何とも言えませんがね。

    もし、InstallShield でということであればここで聞いても回答を得られる可能性はかなり低いので(全く関係ない製品ですし)、ISのユーザーコミュニティ(ML)で聞いたほうがよいと思いますよ。

    何かしらの回答がつくという保証は全くありませんが、ここよりは多少なりとも回答が得られる確率は高いのではないか?と思います。
    http://groups.yahoo.co.jp/group/is-user/ が、ISのユーザーコミュニティのトップとなります。

    一度のぞいてみてもいいかもしれません。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク sk7474 2009年6月18日 7:37
    2009年6月9日 8:42
  • IS2009は持ってませんが、気になったのでググってみました。
    http://helpnet.acresso.com/robo/projects/installshield15langref/GetTempFileNameIS.htm
    これを読む限り、GetTempFileNameISの動作はとっちゃんさんの推察通りですね。
    オプションでファイル自体は消すとか、変わったこともできるみたいだけど。

    あとInstallScriptにこだわらないのであれば、独自DLLやJScriptなんかを用意して呼び出して何とかなるんじゃないでしょうか?<-古い知識しかありません。未確認です。
    確かInstallScriptも独自DLL上で処理されるはずなんで同じことですけど。
    それと、かなり古い知識でしかないですが、InstallScriptには展開先を示す共通変数(正式名称は覚えてない)みたいなのがあったと思います。

    でも、そもそも、その制約ってのが気になります。
    TEMPが無理なら他はもっと無理な気が・・・
    何が何でも展開先を変更したいのなら別ですが、制約を明らかにして別の方法を検討するのも手だと思いますよ。
    • 回答としてマーク sk7474 2009年6月18日 7:37
    2009年6月10日 1:17
  • こんにちは。中川俊輔です。

    とっちゃんさん、toyoさん、詳しい回答ありがとうございます。

    masakiyさん、フォーラムのご利用ありがとうございます。
    有用な情報と思われたため、とっちゃんさん、toyoさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年6月18日 7:40