2017年5月21日日曜日

VB Environment.SpecialFolder.ProgramFiles で嵌る

いやぁ、嵌りました。  嵌りました。
Environment.SpecialFolder.ProgramFiles を使った フォルダ名の取得。
Visual Basic 2008 SP1 (EE) で育った私には、 どうも、 これは 落とし穴 の ひとつ の様です。
今迄も、何回か、嵌っています。


普通にプログラムを書いていて、Program Files フォルダ配下にアクセスする事はそうはありません。
他の既成のもの (他のアプリ) を扱う時に、これは、問題になり得ます。

どう言う事かと言えば、
セットアッププログラムを使ってインストールされる 通常のものには、 標準で、
基底のフォルダがふたつ用意されているからですね。
Program Files と Program Files(x86) のふたつ。

勿論、 32 ビット OS の場合、Program Files(x86) はありませんから、
色々な環境を想定したものを作ろうとすると、
32 ビット OS の Program Files と、 64 ビット OS の Program Files 及び Program Files(x86) との、 3種類になります。

フォルダ名を取得する時に、自分の書くプログラムが、 これらをハードコートしているなら、問題は起き難いのですが、
.Netframework の提供する System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) を使うと嵌ります。

何故ならば、
これの 返り値 は、自分の書くプログラム の 「 32 ビット優先 」 の適否の影響を受けるからです。
32 ビット優先 の場合の、 64 ビット OS の Program Files は Program Files(x86) が 返る! のです。
そうです。
AnyCPU の 32 ビット優先 では、 x64 の時にも、x86 用に準備された答えが戻って来るのです。

言い換えれば、
元々の OS の仕組みに合わせた 返り値 を期待するなら、 AnyCPU で 「 32 ビット優先 」 を外す 必要がある 
と言う事になります。


既存の Visual Studio の標準設定は AnyCPU で 32 ビット優先 になっています。 Visual Studio 2013 や 2017 。
私が長い事慣れ親しんだ Visual Basic (Visual Studio) 2008 では 32 ビット優先 は未だありませんでした。
ですから、ついつい、標準設定のまま書き進め、 その結果、 変な結果に慄く事になるのです。
それ故、 Visual Basic 2008 SP1 (EE) で育った私には、 どうも、 これは 落とし穴 の ひとつ の様です。 .


あれぇ、変だなぁ ... 。  書いている事は合っている筈なのに。

いえ。  実は、合っていないのです。


32 ビット優先 に沿った x86 用のフォルダが答えとして返る のが 正常なのであって、
32 ビット優先 にした場合、 
Environment クラスからは 64 ビット OS での 64 ビット用の Program Files は隠蔽されて見えない 状態です。
無論、 フォルダ名をハードコートすれば、 アクセス制限されている訳ではないので、 普通にアクセス可能な筈です。


この事に気付かないと、 合っている正常なコードを弄り廻す 羽目 に襲われます。
これぞ、 時間の無駄遣い ... 。
あ~、 慣れや習慣 って、 ... 、 怖ろしい。


まぁ、普通は、 他のアプリ が保存されている Program Files 系のフォルダにアクセスするケースは稀でしょうから、
こんな事は気にせずに済むのですが ... 。



[脱線 或いは 参考].

Program Files と Program Files(x86) 。
前者が x64 (若しくは x86 OS では x86) 、 後者が x86 限定。
これは、 正確には、 合っていません。

それが、一般的なルールですが、 守らなければならない と言う訳ではありません。
インストール時点に、標準外のフォルダを指定する場合は、勿論ですが、
標準設定でも、
x64 OS 上で、 どちらかのフォルダ上にサブフォルダをふたつ設けて x86 x64 双方を格納するケースもあります。
実行ファイルには どちらのモードで動くかの印 (PE ヘッダー) が刻まれているので、
何処にあっても、正常に動作するから、 フォルダ分け は 便宜上 のもの とも捉えられますね。

そう言えば、以前、 こんな 投稿  ソフトの格納先 x86(32bit) と x64(64bit)  も書いていました。 .



0 件のコメント:

コメントを投稿