none
Setup Projectで、配置するでデフォルトフォルダーを指定するにはどうしたらいいのでしょうか RRS feed

  • 質問

  • Windows7(64bit)、Visual Studio2010でC++(MFC 32bit) のプログラムを開発しています。

    標準のSetup Projectに取り込み問題な作成出来るのですが、配布先でインストールするときに、配置先を選定するダイアログがデフォルトでは、

    C:\Program Files Folder(X86) になります。 このデフォルトフォルダーを任意のフォルダーに設定できないでしょうか。

    プログラムの仕様で、中間データを文字データファイルとして持っているのですが、状況に応じて、この中間データを書き換える必要があります。

    デフォルトのフォルダーだと、セキュリティー上、権限が問題で書き換えが出来なくなってしまいます。

    苦肉の策で、インストールする際に、C:\ に展開することで可能にしています。 しかし、紛らわしいので、デフォルトフォルダをC:\ にしたいのですが。

    Setup Projectの「ファイルシステム」-「対象コンピュータ上にファイルシステム」「アプリケーションホルダー」のプロパティーで

    DefaultLoation  [Program Files Holder][Manufatuer]\[ProductName] の設定で可能のようですがいかがでしょうか。

    よろしくご教授ください。

    2012年5月17日 13:31

回答

  • その場合、インストール先を変えるのではなく、中間データをユーザー間で共有されるべきものなら「共通のアプリケーション データ フォルダー」、ユーザーごとに独立しているものなら「ユーザーのアプリケーション データ フォルダー」に置くべきですが。特別なフォルダーとカスタム フォルダーを参照してください。
    • 回答としてマーク haysan 2012年5月18日 2:24
    2012年5月18日 0:15

すべての返信

  • その場合、インストール先を変えるのではなく、中間データをユーザー間で共有されるべきものなら「共通のアプリケーション データ フォルダー」、ユーザーごとに独立しているものなら「ユーザーのアプリケーション データ フォルダー」に置くべきですが。特別なフォルダーとカスタム フォルダーを参照してください。
    • 回答としてマーク haysan 2012年5月18日 2:24
    2012年5月18日 0:15
  • 早速の返信、ありがとうございます。

    やはり、ルートフォルダーにインストールする方法は、邪道のようですね。 ある作者のプログラムがC:\ にインストールする方法を採用し、まねたらスムーズに動作したため、Setup Program のインストールフォルダ選定ダイアログで、ルートにインストールするようにしていました。 この方法は、セキュリティー上良くないのでしょうか?

    カスタムフォルダーの使い方を研究します。

    2012年5月18日 2:31
  • 作ろうとしているアプリケーションの位置づけがわからないため一般的な回答をしました。

    セキュリティが原因で書き込めないことが判明しているわけですから、セキュリティを無効化すれば書き込めるわけです。フォルダーのアクセス権を任意ユーザーにするとかUACをキャンセルするとか。

    逆にインストール先をルートディレクトリに指定したとして、ユーザーがインストール先を(より一般的なProgram Filesに)変更したら動作しなくてもよいのでしょうか?

    2012年5月18日 6:22
  • ルートディレクトリに指定する方法は分かりました。Setup Project の「ファイルシステム」-「対象コンピュータ上にファイルシステム」「アプリケーションホルダー」のプロパティーで

    DefaultLoation  C:\[Manufatuer]\[ProductName] の設定で、配置設定のダイアログで、デフォルトがC:\ になりました。

    しかし、仰るように、ユーザーがインストール先をProgram Filesに変更すると問題です。

    詳しく経緯を説明します。 今まで開発してきたプログラムは、MFCのドキュメントビューを利用したプログラムです。

    しかし、Viewを作成するとき、モニター出力とプリンタを別々に作らなければならなく、非常に時間がかかり、保守上も問題でした。

    そこで、CHtmlViewの参考をまねて、出力をHtmlファイルにしました。これで、標準のブラウザーで表示も印字・プレビューが簡単に出来るようになりました。

    出力ファイルをアプリケーションフォルダー下に \data フォルダーをSetup Projectで作り、このフォルダーに書き込む方法としました。 

    しかし、配布用のプログラムでテストした所、書き込みエラーが出てしまい、いろいろといじっていたわけです。 

    今までは、Windows XPを使って開発してきたため、なんとか使えていましたが、Windows 7に最近変更したので、このセキュリティーの問題が発覚したようです。 

    ご紹介いただいた 特別なフォルダーとカスタム フォルダー を読みSetup Projectでカスタムホルダーの作り方が分かりましたが、アプリケーションの中から、このフォルダーを

    読んだり書き込んだりする方法がよくわからず困っています。 絶対パスで指定するには、ユーザー側のOSに依存するようで、固定することが出来ないようです。

    OS毎のパスを書かなければいけないでしょうか?

    2012年5月18日 9:20
  • Vista以降のみならSHGetKnownFolderPath()、XP以前も対象とするのならSHGetFolderPath()で適切なPathを取得してください。
    2012年5月18日 11:58
  • SHGetFolderPath() 難解な関数のようですね、早速Helpなどより勉強してみます。

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

    2012年5月18日 13:18
  • SHGetFolderPath()関数以下のようにして、フルパスが取得できました。

     TCHAR szPath[MAX_PATH] = _T("");
     CString szFile = _T("");

     // AppDataデレクトリを取得
     SHGetFolderPath(NULL,
         CSIDL_APPDATA|CSIDL_FLAG_CREATE,
         NULL,
         0,
         szPath);

     szFile = szPath;

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

    2012年5月19日 7:47