Windowsの64ビット版では「Program Files」フォルダは64ビットのプログラム用、「Program Files (x86)」フォルダは32ビットのプログラム用になっているのは知っていますが、なぜその必要があるのでしょうか?
必要なこと」とは、「なぜマイクロソフトは他の設計上の決定をすることができなかったのか」という意味ではありません。むしろ、「なぜ、現在の64ビットWindowsの設計を考えると、32ビットプログラムは64ビットプログラムとは別のトップレベルのフォルダを持たなければならないのか」ということを言いたいのです。別の言い方をすれば、”リダイレクト機構をどうにかして回避し、すべてのプログラムを実際のC:\Program Files\
に強制的にインストールすると、何がうまくいかないのか?
スーパーユーザーなどでは、「1つは32ビットプログラム用、もう1つは64ビットプログラム用」と主張する質問がたくさんありますが、私が見つけた中で理由を述べているものはありません。私の経験では、32ビットプログラムが正しい場所にインストールされているかどうかは問題ではないようです
Windowsは、”Program Files (x86) “から実行されているプログラムに対して、何らかの形でそれ自体が異なって表示されるのでしょうか?Program Files」ではなく「Program Files (x86)」にインストールされているプログラムに対して、何が違うのかを正確に示す記述はありますか?マイクロソフトが正当な技術的理由もなく新しいフォルダを導入するとは思えないのですが
179 Stephen Jennings 2012-06-27
簡単な答えです。レガシーな32ビットアプリケーションが以前と同じように動作し続けるようにするために、64ビットアプリケーションに醜いルールを課すことなく、恒久的な混乱を生み出すことになります
それは必要ありません。32ビットのDLLと実行可能ファイルを64ビットのDLLと実行可能ファイルから分離するための独自の方法をすべてのアプリケーションに要求するなど、他の可能性のある解決策よりも便利なだけです
主な理由は、64 ビットシステムの存在すら知らない 32 ビットアプリケーションを「ただ動作する」ようにするためで、たとえ 64 ビット DLL がアプリケーションが見える場所にインストールされていたとしても、そのアプリケーションは 64 ビット DLL をロードできません。32 ビットアプリケーションは 64 ビット DLL をロードすることができないので、32 ビットアプリケーション (64 ビットシステムよりも前に 64 ビットシステムが存在する可能性があり、64 ビットファイルの存在すら知らない) が 64 ビット DLL を見つけてロードしようとして失敗し、エラーメッセージを生成しないようにするための方法が必要でした
これに対する最も単純な解決策は、一貫してディレクトリを分離することです。本当に唯一の代替案は、すべての64ビットアプリケーションに、32ビットアプリケーションが見ない場所、例えばそのアプリケーション内のbin64
ディレクトリなどに実行ファイルを「隠す」ことを要求することです。しかし、それはレガシーアプリケーションをサポートするためだけに、64ビットシステムに恒久的な醜さを課すことになります
93 David Schwartz 2012-06-27
これにより、アプリケーションを上書きすることなく、32bit版と64bit版の両方をインストールすることができます
翌日、この回答とコメントスレッドを見て、私の回答に大きな見落としがあった可能性に気がつきました。私は誤ってプログラミングのバックグラウンドを仮定し、私のコメントであなたのことを話していたとき、私はユーザーではなく、プログラマを意味していました
私はマイクロソフトで働いていないので、これらのフォルダの背後にある本当の理由が何なのかはわかりませんが、これらのフォルダを持っている理由は非常に明白なので、私はそれを議論するのに問題はないと思います
では、分解してみましょう!
フォルダーってすごいですね
同意しましょうフォルダーは素晴らしい!私たちはそれらを必要としません、私たちは十分に可能なファイル名を持っているので、あなたのハードドライブのルートにすべての単一のファイルを置くために、なぜすべてのフォルダを持っていますか?
物を注文するのを手伝ってくれる物を注文することは素晴らしいことです。物事をより簡単に処理するのに役立ちます。特に構造を必要とする機械で作業をするときに便利です
データとロジックの分離は素晴らしい
プログラミングでよく見られるパラダイムは、データとロジックを分離することです。何かをするための方法を知っている部分と、何かをするための別の部分が欲しいということです
67 community wiki None
TL;DR:
要約すると、いや、それは必要ありません; 彼らは1つのフォルダを使用することができました、そして、いや、Windowsは1つの場所または別の場所から実行されるプログラムとは異なるそれ自体を提示しません
まあ、みんながこの件について自分の意見を述べているようなので、私の2セントを投げかけておきます。マイクロソフトがなぜ 32 ビット版と 64 ビット版のプログラムに別々のトップレベル フォルダを作成することにしたのかについては、他の人がすでに推測していますので、その部分は置いておきます (一番の理由は、プログラマの利便性のためだという David の説明でした)。もちろん、それにしても、なぜこれが必要なのか?
代わりに、質問の本文に触れます
Windows は “Program Files (x86)” から実行しているプログラムに対して、何らかの形でそれ自体が異なって表示されるのでしょうか?
そうではありませんが、プログラムの場所は動作に影響を与えますが、あなたが考えるような方法ではありません。環境変数だけではありません)。)この環境は、実行ファイルの内容に依存します(32ビットプログラムと64ビットプログラムでは内部的に異なります)。32ビットのプログラムを64ビットシステムで実行すると、32ビット環境をエミュレートした32ビットサブシステムで実行されます。WoW64 (WoW64 は
管理者権限の有無にかかわらずプログラムを実行すると、プログラムの実行方法に影響を与えますが、場所は影響を与えないはずです (たとえば、いくつかのドライバのように場所に依存する例はありますが)。
(私は別のコンピュータを使っているので、ブラウザの履歴を頼りにステップを遡ることはできませんが、先日、このSUの質問に答えているうちに、このSOの質問に行き着いてしまい、そのせいでGoogle PROCESSOR_ARCHITEW6432 これはこのSOの質問とこの Microsoft ブログの投稿)
途中のどこかで、envirnoment 変数 %processor_architecutre%
がコマンドプロンプトをどこから実行したかによってどのように異なる結果を与えるかについての StackOverflow の投稿を読みました (正確な引用文を探してみます)。System32\
かSysWoW64\
か)のどちらから実行されたかによるものであることがわかりました。)言い換えれば、場所はプログラムの動作に影響を与えるようですが、それはプログラムの異なるバージョンがあるからであって、Windows がフォルダを特別な方法で扱うからではありません。
FreePascal では、DOS 版と Windows 版の両方をインストールすることができます。%programfiles%\FreePascal
.実行ファイル (.exe
, .sys
, .dll
, .ovr
など) を別々のフォルダに保存し、画像やソースファイルなどのリソースファイルを共有することで、異なるアーキテクチャを管理します。David が言ったように、それらを別々にしておけば (つまり、変数を使用してファイルが 1 つのセットしかないように見せるなど)、プログラマにとっては簡単なだけです
14 Synetech 2012-06-27
もう一つの理由は、ほとんどのプログラムが %PROGRAMFILES% のような環境変数を使用して、プログラムがインストールされた場所を指すようにしていたからです。64 ビットのプログラムでは、通常の場所に移動します。32 ビットのプログラムでは、それは新しい Program Files (x86)
フォルダにリダイレクトされます
しかし、少なくともVisual Studioの新しい.Netのものでは、彼らは今、このためのすべての必要性を排除するApp.Local変数を持っています
11 Canadian Luke 2012-06-27
この32ビットから64ビットへの移行に対するMicrosoftの解決策は、ほとんどの32ビットアプリケーションのレガシーサポートを追加することでした。言い換えれば、ほとんどの32ビットアプリケーションは64ビットのオペレーティング環境で機能します。64 ビットアーキテクチャ上の他のオペレーティング・システムでは、32 ビットアプリケーションをロードしたり実行したりすることができないことに注意してください
移行を容易にするために、Microsoftは、通常のProgram Filesフォルダ内の真の64ビットアプリケーションと混ざらないように、デフォルトですべての32ビットアプリケーションをProgram Files (x86)フォルダにロードするように指定しています
“どうやってリダイレクトを回避して、強制的に本当のC:Program Filesにインストールしたらどうなるの?”
何もありません。2つのプログラムディレクトリは、整理のためか、Internet Explorerのように32ビット版と64ビット版の2つのバージョンを持つプログラムを別々にしておくためだけのものです。しかし、32ビット版のプログラムを「Program Files」に、64ビット版のプログラムを「Program Files x86」にインストールしても何も起こらず、プログラムは同じように実行されます
Wikiは言う
一部のアプリケーションインストーラは、インストールパスの場所内のスペースを拒否します。32 ビットシステムでは、Program Files フォルダの短い名前は Progra~1 です。 64 ビットシステムでは、64 ビット Program Files フォルダの短い名前は Progra~1 (32 ビットシステムと同じ) で、32 ビット Program Files (x86) フォルダの短い名前は Progra~2 になりました
8 avirk 2012-06-28
その理由は、開発者がプログラムを64ビットにアップグレードするのを容易にするためです。開発者は、32ビットモードでコンパイルするときにあるディレクトリにプログラムがあるかどうかをチェックし、64ビットモードでコンパイルするときに別のディレクトリにあるかどうかをチェックするためのカスタムコードを書く必要がありません。同様に、レジストリエントリは、32ビットプログラムと64ビットプログラムの間で分離されています
これは、よく考えずにコンパイルモードを64ビットに変更しただけの無知な開発者によるコンフリクトを防ぎ、ユーザーが32ビット版と64ビット版の両方のソフトウェアを同時にインストールできるようにしたいと考えている開発者の膨大な作業を防ぐことができます
しかし、なぜどのようなプログラムでも、両方のバージョンを同時にインストールできるようにしたいのでしょうか?一つの例です。Photoshop と IE にはネイティブの .dll の拡張子があります。32 ビット版と 64 ビット版のコードを同じプロセスで混在させることはできないので、32 ビット版のアドオンを 64 ビット版で使用することはできませんし、その逆もできません。したがって、Photoshop/IEは両方のバージョンをインストールできるようにしないと、既存のアドオンの膨大な基盤を壊す危険性があります
6 BlueRaja – Danny Pflughoeft 2012-06-27
Program Files(x86)」上で動作するプログラムは、WOW64 サブシステムを使用します(Windows 64ビット上のWindows 32ビットは、x64アーキテクチャシステム上でx32アプリケーションを実行することを意図したドライバとAPIのセットです)
WoW64 サブシステムは、すべての 64 ビットバージョンの Windows 上で同様のインターフェイスを持つ軽量な互換性レイヤで構成されています。WoW64サブシステムは、64ビットシステム上で変更されていない32ビットWindowsアプリケーションを実行するために必要なインターフェースを提供する32ビット環境を構築することを目的としています。技術的には、WoW64は3つのダイナミックリンクライブラリ(DLL)を使って実装されている
- Wow64.dll、ポインタとコールスタックの操作を含む、32 ビットと 64 ビットの間の呼び出しを変換する Windows NT カーネルへのコアインターフェイス
- 32ビットアプリケーションのための適切なエントリポイントを提供するWow64win.dll
- プロセッサを32ビットモードから64ビットモードに切り替える作業を行うWow64cpu.dll
64ビットシステムは32ビットアプリケーションを “エミュレート “する必要があり、それがWindowsが2つのProgram Filesフォルダを “分離 “する必要がある理由です
5 Diogo 2012-06-27
ここでの回答とネット上での回答がかなり違うのが面白いですね。この重要な質問に対する正確な答えを見つけるのは難しいことです。インターネット上には、かなりの量の虚偽の情報が提示されているようで、混乱を招いています
かなりの量の調査をして、次のような結論を導き出しましたが、これは正確だと思います
- アプリケーションが保存されている場所に違いはありません。実行時に、Windowsはアプリケーションが32ビットか64ビットかを判断し、適切なDLLとレジストリセクションを自動的に使用します
これは自動的に行われ、アプリケーションの保存場所に依存しません。32 ビットと 64 ビットのフォルダを別々にしても、速度、信頼性、その他の機能的な利点はありません
デフォルトで 2 つのフォルダ (「Program Files」と「Program Files (x86)」) に分割されている唯一の理由は、同じプログラムの 2 つのバージョン (32 ビット版と 64 ビット版) がある場合に、重複するファイルを分離しておくための簡単な方法を提供するためです。この場合でも、すべてのファイル名が一意である限り、実際には何の影響もなく同じフォルダに存在することができます
上記の結論には注意点があり、それはコード化されていないアプリケーションのものです。アプリケーションにハードコードされたパスがある場合、そのパスだけを使います。ルールとして、パスは決してアプリケーションにハードコードされてはいけませんが、たまにプログラマがこのミスを犯すことがあります。この場合、プログラムはハードコードされたパスを使用します。アプリケーションがインストールされているディレクトリは、実際にファイルを探す場所には影響しません
5 RockPaperLz- Mask it or Casket 2014-10-16
フォルダを分けることで、ネイティブ 64 ビットアプリケーションと WoW64 を必要とするアプリケーションを別々に保つことが可能になります
これは便利です – @OliverSalzburg がすでに指摘しているように、ウェブブラウザの 64-bit と 32-bit の両方をインストールしたい場合 (例えば)、プラグインやアドオンの中には 2 つのうちの 1 つでしか利用できないものもあるためです
フォルダを分けることで、レジストリーリダイレクトのようなテクニックを使って、この分離を自動的に行うことができます
インストーラが RegQueryValueEx を使用してレジストリを読み込んでプログラムファイルのフォルダを決定しようとしたとします
いずれにしてもレジストリキーを読み込もうとします
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
通常はC:\Program Files
を指します
ただし、インストーラーが32ビットアプリケーションの場合、レジストリのリダイレクトでレジストリキーが発生します
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion
を代わりに読むことができ、通常はC:\Program Files (x86)
を指します
これらの特定のフォルダ名が使用されている理由は、この選択をした人だけが答えることができます。デフォルトのフォルダ名を変更したい場合は、いつでも変更できます
Windowsは「Program Files (x86)」から起動しているプログラムに対して、なぜか別のものを提示しているのでしょうか?
私はそれを疑っています。ほとんどのインストーラーは、カスタムインストールフォルダを選択することを許可しているので、プログラムがどこにインストールされるかは本当に重要ではありません
3 Dennis 2012-06-27
ここでの混乱が信じられない…まず、私は専業の開発者です
MSは、古い32ビットアプリケーションと新しい64ビットアプリケーションの両方でDLLを使用する場合を解決するためにこれを行った。古い方法は、再コンパイルできない古いプログラムが壊れてしまうので、変更できませんでした(System32やProgram Filesなど)
そこでMSは、64ビット固有のプログラム、アセンブリ、ライブラリを保存するフォルダを作成し、新しいプログラムが適切なライブラリにリンクできるようにし、古いプログラムは通常通りに動作し続けるようにしました
現状では、.Net DLL は、同じマシン上に他のバージョンの DLL と共存することができます。例えば、Library.1.0.1、Library.1.0.2、Library.1.1.0などがあります。そして、これは特定のビットサイズ(32または64)の場合のみです。別々のフォルダを使用しない場合は、すべてのアセンブリが32ビット版と64ビット版を持つ必要があります。これは、同じアセンブリの複数のバージョンをすでに含んでいるディレクトリをひどく乱雑にしてしまいます
これはすべて開発者の問題です。ユーザーとしては、Windows 7 64で32ビット版のプログラムを使って作業をしているときだけ対処しなければなりません。そして、32 ビット版と同じアプリケーションを 64 ビットでも実行できる機能の方が好きです。64 ビットでコンパイルする必要がある 32 ビットのアプリケーションで作業しているときは、コンパイラにそうするように指示するだけです。Dll名や他のすべてのものは同じままです
Windows 95/98でこれが存在しなかったのは、これらのシステムが32ビットランタイムをシミュレートしていたからで、本物の32ビットOSではありませんでした。これは、”thunking “という名前の何かで32ビット実行を偽装していました
ここに良い定義があります。http://searchwinit.techtarget.com/definition/thunk
3 Jason Locke 2012-06-28
これは全く必要ありません。例えば、私の作業用パソコンには、IT部門がインストールしたアプリケーションと区別するために、各アプリケーションをC:\MyPrograms\
のフォルダにインストールしています
もちろん、これでは1つのアプリケーションの両方のバージョン(32ビットと64ビット)をインストールすることはできませんが、私の場合は問題ありません
プログラムを起動すると、常に最初のDLL C:\Windows\System32\ntdll.dll
が実行されます。このDLLは、あなたのプログラムが32ビットか64ビットかを決定します。これに応じて、すでにいくつかの回答で述べた WoW64
にリダイレクトされます
0 Wernfried Domscheit 2015-05-08