フォルダへの書き出し
じゃあ、そのフォルダへの書き出しはどうなってんの??って話ですよ。VistaTest.txtという名前のテキストファイルをそれぞれのフォルダに書き出してみました。書き出し内容はシステム時刻、成否の判定はエラーの有無です。
- Xp
列挙体 | Administrator | PowerUser | User |
ApplicationData | ○ | ○ | ○ |
CommonApplicationData | ○ | ○ | ○ |
CommonProgramFiles | ○ | ○ | × |
Cookies | ○ | ○ | ○ |
Desktop | ○ | ○ | ○ |
DesktopDirectory | ○ | ○ | ○ |
Favorites | ○ | ○ | ○ |
History | ○ | ○ | ○ |
InternetCache | ○ | ○ | ○ |
LocalApplicationData | ○ | ○ | ○ |
MyMusic | ○ | ○ | ○ |
MyPictures | ○ | ○ | ○ |
Personal | ○ | ○ | ○ |
ProgramFiles | ○ | ○ | × |
Programs | ○ | ○ | ○ |
Recent | ○ | ○ | ○ |
SendTo | ○ | ○ | ○ |
StartMenu | ○ | ○ | ○ |
Startup | ○ | ○ | ○ |
System | ○ | ○ | × |
Templates | ○ | ○ | ○ |
GetTempPath関数 | ○ | ○ | ○ |
列挙体 | 管理者権限あり | 管理者権限無し |
ApplicationData | ○ | ○ |
CommonApplicationData | ○ | ○ |
CommonProgramFiles | ○ | ○ |
Cookies | ○ | ○ |
Desktop | ○ | ○ |
DesktopDirectory | ○ | ○ |
Favorites | ○ | ○ |
History | ○ | ○ |
InternetCache | ○ | ○ |
LocalApplicationData | ○ | ○ |
MyMusic | ○ | ○ |
MyPictures | ○ | ○ |
Personal | ○ | ○ |
ProgramFiles | ○ | ○ |
Programs | ○ | ○ |
Recent | ○ | ○ |
SendTo | ○ | ○ |
StartMenu | ○ | ○ |
Startup | ○ | ○ |
System | ○ | ○ |
Templates | ○ | ○ |
GetTempPath関数 | ○ | ○ |
VistaはあっさりオールOKですね。んー、なんだか拍子抜け。しかもこれじゃ管理者権限有り無しの違いが無い感じですねぇ。・・・とこれで終わるわけも無く。
今度はファイル名をVistaTest.dllにして書き出してみます。内容はさっきと同じです。
- Xp
- VistaTest.txtの時と同じ
- Vista
列挙体 | 管理者権限あり | 管理者権限無し |
ApplicationData | ○ | ○ |
CommonApplicationData | ○ | ○ |
CommonProgramFiles | ○ | × |
Cookies | ○ | ○ |
Desktop | ○ | ○ |
DesktopDirectory | ○ | ○ |
Favorites | ○ | ○ |
History | ○ | ○ |
InternetCache | ○ | ○ |
LocalApplicationData | ○ | ○ |
MyMusic | ○ | ○ |
MyPictures | ○ | ○ |
Personal | ○ | ○ |
ProgramFiles | ○ | × |
Programs | ○ | ○ |
Recent | ○ | ○ |
SendTo | ○ | ○ |
StartMenu | ○ | ○ |
Startup | ○ | ○ |
System | ○ | × |
Templates | ○ | ○ |
GetTempPath関数 | ○ | ○ |
管理者権限が無い場合CommonProgramFiles、ProgramFiles、Systemの3つで失敗しました。さっきはちゃんと書けたのになぜでしょう。
この3つのフォルダは特殊で一般ユーザーのシステムファイル(*.dll、*.sys等)の操作を許しません。しかもシステムファイル以外も先の検証で上手くいったように見えますが厳密に言うと成功していないことになります。というのは、この3つのフォルダは「[USER]\VirtualStore」フォルダの下にリダイレクトされます。*1つまり一般ユーザーでProgramFilesフォルダにVistaTest.txtを出力した場合は[USER]\VirtualStore\ProgramFiles\VistaTest.txtに書き出すことになります。しかも読み取りはVirtualStoreフォルダ配下を優先で探し無ければ元フォルダを探します。なのでファイル出力がからむ動作検証の時、エラーは発生しないけど書き出したはずのファイルが無いとか、設定ファイルは正しいのにさっぱりDBに繋がらないなんて勘違いしちゃう可能性があるんですねぇ。現にしちゃってる人を知っていますw 気をつけないといけませんねぇ。この仕組みさえ知っていればVista対応はそんなに難しいことじゃないんじゃないかと思っています。