開発環境 OS Windows XP SP3
IDE Visual Studio 2005 SP1 MFC SDI
Server 環境 OS Windows 2003 Server
!不具合内容
Client 環境 OS Windows Vista 設定ファイルをC:\直下に書きこめれない
OS Windows XP 設定ファイルをC:\直下に書きこめれる
不具合詳細
一時的に
(当該Severにログオンしている間だけでも、一旦ログオフした後は消えてもかまわない)
設定ファイルをC:\ 直下に保存したいのですが、XP では保存できるのですが
Vista では保存できまない。
問題
MFCおよび、VC++ で当該不具合の対処のしかたを、ご存知の方がおられましたら、教えて
ください。
> 当該不具合の対処のしかた
C:\ 直下に書き込まないのが正しい方法です。
aetos さん、ありがとうございます
それはWindows Vista の仕様でしょうか?
もし、それならば、何処に書き込んだらいいのでしょうか?
一般的な設定ファイルであれば、一般的には各ユーザーごとの AppData フォルダになり
ます。
Windows XP までであれば、SHGetFolderPath 関数に CSIDL_APPDATA または
CSIDL_LOCAL_APPDATA を渡して得られる場所。
Windows Vista 移行であれば、SHGetKnownFolderPath 関数に
FOLDERID_RoamingAppData または FOLDERID_LocalAppData を渡して得られる場所。
(ローカルとローミングのどちらを使用するかはケースバイケースです)。
また、今回は消えても構わないとのことですが、消えるのが望ましい一時的なファイル
であれば Temp ディレクトリ(GetTempPath 関数で得られる場所)もいいでしょう。
こういった適切なディレクトリを使用することは、Vista からではなく、XP でもそうす
べきでした。
ところで今回はネットワークとのことですが、その設定ファイルにネットワーク越しに
アクセスするとなると話が変わってきます。
ローカルマシンからしかアクセスしないなら上記の通りでいいでしょう。
詳しくは「UAC」「ユーザーアカウント制御」「LUA(Least-privileged User
Account)」等のキーワードで検索すると情報が出てくると思います。
aetos さん、丁寧な解説をしていただき、ありがとうございました
ファイルの保存の仕方のセオリーは理解できました、XP の環境は
SHGetSpecialFolderLocation(CSIDL) 関数で保存するディレクトリを決めるように直しま
した。
Vista の環境は今ないので、後日試してみます、SHGetKnownFolderPath 関数は
戻り値がHRESULT 型、引数にCSIDL ではなくGUID を渡すとか、
色々と変わっているようですが、やってみます
Visual Studio 2005 pro ですと、別途SDK for Vista もインストールしないといけない
ようですし
コンパイルスイッチを USE_VISTA とUSE_XP を作り別々の実行ファイルを
作成しないといけないですし、手間がかかりそうですが、とにかくやってみます。
一旦解決とさせていただきます、お世話になりました。
VistaでもSHGetFolderPathは使えます(SHGetSpecialFolderLocationも使えます)。
Vista以降でしか動かなくてもいいアプリではSHGetKnownFolderPathが推奨されますが、
条件付きコンパイルまでする必要はないと思います。
なお、SHGetFolderPathは古いOSだと面倒くさいみたいな記事を見ますが、Windows 2000
以降であれば特に気にすることなく使って大丈夫です(Shell32.dll に標準で入ってい
ます)。
SHGetSpecialFolderLocationでは、付随してSHGetPathFromIDListやCoTaskMemFreeを使
わなければなりませんが、SHGetFolderPathではその必要もなく楽ちんです。
そろそろ、98やNT 4.0に配慮しなくてもいいと思うのですが、そうも行きませんか。