none
セットアッププロジェクトでのレジストリ登録について RRS feed

  • 質問

  • 現在、VisualStudio2005を利用してアプリケーション開発を行っているのですが、
    セットアッププロジェクトの作成中にいくつか疑問が出てきましたので、
    以下に列挙させていただきます。
    1. セットアップ中に指定したアプリケーションのインストールパスを、セットアップの処理中に、レジストリに登録することは可能なのでしょうか。
    2. セットアッププロジェクトのアプリケーションフォルダに対してインストールされるファイルとして、外部ファイル(ファイルの数が確定できないもの)を含めることは可能なのでしょうか。
    1.に関しては、セットアップ終了直後に、別のアプリケーションからインストール先のパスを利用したいため、たとえば、レジストリに登録できなくとも、セットアップ実行中に指定したインストールパスが取得できる方法があれば、ご教授下さい。

    2.に関しては、例えばSetup.exeと同じパスにDataフォルダが存在し、Dataフォルダに含まれている全てのファイルを、セットアップ実行中にインストール先\Dataとしてコピーできればと考えております。

    以上、よろしくお願いいたします。
    2006年6月28日 8:25

回答

  • WindowsInstaller のカスタム操作に、 System.Configuration.Install.Installerを継承したクラスを記述し、そのクラスの、Install(ByVal savedState As System.Collections.IDictionary) 、Uninstall(ByVal savedState As System.Collections.IDictionary) に、セキュリティ上許されるあらゆる動作を記述することができます。ここに、ファイルをコピーをするコードを書くと、望みのことが実現できます。

    どのファイルをアンインストール時に削除すべきかは、savedState に記録しておきます。TARGETDIRなどの値は、カスタム動作のオプションを通して、知ることができます。 

    2006年6月28日 20:44

すべての返信

  •  KEROBOT さんからの引用

    セットアップ中に指定したアプリケーションのインストールパスを、セットアップの処理中に、レジストリに登録することは可能なのでしょうか。

    可能です。

    インストール先のフォルダ名は TARGETDIR プロパティに格納されています。

    セットアッププロジェクトのレジストリ編集画面で TARGETDIR を基点としたパス名を、希望の位置に書き出されるよう設定してください。

     KEROBOT さんからの引用

    セットアッププロジェクトのアプリケーションフォルダに対してインストールされるファイルとして、外部ファイル(ファイルの数が確定できないもの)を含めることは可能なのでしょうか。

    セットアッププロジェクトでインストーラを作成する限り、ほぼ不可能です。

    実現には .msi ファイルの論理的な構造など、Windows Installer に関するある程度深い知識が必要になります。

     

    2006年6月28日 10:34
  • 渋木様、情報ありがとうございます。

    1.のセットアップパスの件に関しては、
    ご指摘の通り、レジストリキーを作成した後、Valueに[TARGETDIR]を指定することで、
    レジストリに登録することができました。

    2.の外部ファイルをインストールに含める件に関しても、セットアッププロジェクトでインストーラを作成する限りほぼ不可能ということで了解いたしました。

    自分でもいくつか方法を調べてみたところ、InstallShieldであれば、ある程度簡単に実現可能なようですが、今回は購入が難しいため、現状で作成しているSetup.exeを呼び出すためのC++(MFC)プログラム(セットアップラッパー)側で、ファイルコピーを行うこととしてみます。

    この場合、アンインストールを考慮しなければいけませんが、そちらに関しては、
    実現方法を考えて見ます。

    ありがとうございました。
    2006年6月28日 11:15
  • WindowsInstaller のカスタム操作に、 System.Configuration.Install.Installerを継承したクラスを記述し、そのクラスの、Install(ByVal savedState As System.Collections.IDictionary) 、Uninstall(ByVal savedState As System.Collections.IDictionary) に、セキュリティ上許されるあらゆる動作を記述することができます。ここに、ファイルをコピーをするコードを書くと、望みのことが実現できます。

    どのファイルをアンインストール時に削除すべきかは、savedState に記録しておきます。TARGETDIRなどの値は、カスタム動作のオプションを通して、知ることができます。 

    2006年6月28日 20:44
  • とっちゃんです。

    レジストリについては、既に渋木さんが書いてますので、そちらを参考にしてください。

    レジストリに書き込む場合の注意点としては、HKEY_LOCAL_MACHINE に書き込む場合は、インストール条件を全てのユーザーにしてあげないといけないことくらいですかね。

    ファイルの追加ですが、ある程度までは任意のフォルダへ追加できます。

    ファイルシステムのビューを出して、アプリケーションフォルダの右メニューにフォルダというのがあります。

    そこでフォルダを追加、そのフォルダにファイルを追加で、プロジェクト外部の任意のファイルを追加できます。

    ルートで特別なフォルダを出すと、いくつかの規定フォルダに直接インストールすることも出来ます。

     

    2006年6月29日 4:14