64ビットWindowsで64ビットDLLがSystem32に、32ビットDLLがSysWoW64に移動するのはなぜですか?


227

いつファイルを配置する必要があるか知りたい

64ビットWindowsシステムでは、C:\ Windows \ System32またはC:\ Windows \ SysWOW64。

32ビット用と64ビット用の2つのDLLがありました。

論理的には、32ビットDLLをC:\ Windows \ System32の下に、64ビットDLLをC:\ Windows \ SysWOW64の下に置くと思いました。

驚いたことに、それは逆です!32ビットの1はCに行く:\ WINDOWS \ SysWOW 64、および64 DLLをCに入るビット:\ WINDOWS \システム32

非常に紛らわしいもの。この背後にある理由は何ですか?


2
また、これ:Windowsは、現在の作業ディレクトリとシステムPATHを調べます。他に指定する方法はありません。ああ待って、あります。DLLに検索パスを埋め込むことができます。これは、8バイトの長さのフィールドです。はい。8文字。
Jeroen Baert、2012

これはWindows 7では当てはまらないようです。system32ファイルのDLLでファイルを実行していますC:\ Windows \ system32 \ user32.dll C:\ Windows \ system32 \ user32.dll; MS WindowsのPE32実行可能ファイル(DLL)(GUI)Intel 80386 32-bitしかし、64ビットDLLの場合、PE32 +実行可能ファイルをMS Windows(DLL)(コンソール)に出力しますMono / .NetアセンブリこのDLLは.Netではないことに注意してくださいアセンブリ。ネイティブDLLです。
user877329 2013年


11
元Microsoftieへのインタビュー。(これがどのようになったかについての真剣な説明については、この回答を参照してください。)
Tgr

superuser.com/a/157301/241386「下位互換性の理由。多くのアプリケーションが想定すべきでないことを想定し、パスをハードコード化している」
phuclv 2015

回答:


225

私はSystem32の名前を変更することを意図していたと思いますが、そのパスに対してハードコーディングされた多くのアプリケーションは、それを削除することは現実的ではありませんでした。

SysWoW64は64ビットシステムのDLLを対象としていませんでした。これは実際には「Windows on Windows64」のようなもので、64ビットウィンドウで32ビットアプリを実行するために必要なビットを意味します。

この記事では少し説明します:

「Windows x64には、64ビットDLL(sic!)を含むディレクトリSystem32があります。したがって、ビット数64のネイティブプロセスは、それらが予期する「自分の」DLLをSystem32フォルダーで見つけます。2番目のディレクトリSysWOW64には、32ビットDLL。ファイルシステムリダイレクタは、32ビットプロセスの実際のSystem32ディレクトリを非表示にし、SysWOW64をSystem32の名前で表示するという魔法のような働きをします。

編集:インストーラーの場合は、システムフォルダーへのパスをハードコードしないでください。代わりに、インストーラーがエミュレーションレイヤーで実行されているかどうかに基づいて、Windowsに処理を任せます。


27
ええと、私は今日、この奇妙さに遭遇しました。彼らがやったなんて誤解を招くようなことだ。
アンディホワイト

16
今日もこれに遭遇しました...とても混乱しています-Glut 32ビットdllは/ SysWOW64に入り、Glut 64ビットdllは/ System32に入ります。誰かがそれを書き留めるべきです。インターネット上で。
Jeroen Baert、2012

8
良いニュースは、マイクロソフトのエンジニアリングの天才の例として、これはほとんど自己文書化されていることです。
Spike0xff

8
私が取得できないことの1つは、ファイルシステムが32ビットアプリであることを通知してSysWOW64フォルダーにリダイレクトできる場合、代わりに64ビットアプリを検出してSystem64?にリダイレクトできないのはなぜですか。
Cole Johnson

6
System32は、Windows 32ビットバージョンのシステムDLLです。システムは16ビット版です。Windows 8を提供してくれたのと同じ会社から、64ビットOSで実行する場合、32ビットDLLにはSysWow64、64ビットDLLにはSystem32が提供されました。64ビットシステムでは、Systemフォルダーは古い16ビットジャンクのままであり、System32のみが32ビットではなく、32ビットのものはシステムディレクトリにあり、名前に64が付いています。これがどのように人を助けるのかはわかりません。それは物事を複雑にし、すべてを壊します。64ビットに変換するときに、ハードコードされた「System32」を「System64」に適合させることから人々を救うためのすべて。イディオシー
アルマンド

26

追加する必要があります:とにかくあなたのdllを\ system32 \に置くべきではありません!コードを変更し、インストーラーを変更します。c:\ windows \のどこにもないビットのホームを見つけます

たとえば、インストーラーはdllを次の場所に置きます。

\program files\<your app dir>\

or

\program files\common files\<your app name>\

これを実際に行う方法は、環境変数%ProgramFiles%または%ProgramFiles(x86)%を使用して、Program Filesがどこにあるかを見つけることです.... c:\ program files \であるとは限りません。 ..)

次にレジストリタグを設定します:

HKLM\software\<your app name>
-- dllLocation

DLLを使用するコードはレジストリを読み取り、その場所にあるDLLに動的にリンクします。

上記は賢い方法です。

DLLまたはサードパーティのDLLを\ system32 \または\ syswow64にインストールすることはありません。静的にロードする必要がある場合は、dllをexeディレクトリ(それらが見つかる場所)に配置します。exe dirを予測できない場合(たとえば、他のexeがdllを呼び出す場合)、dll dirを検索パスに含める必要がある場合があります(可能な場合はこれを避けてください)。

system32とsyswow64はWindowsが提供するファイル用です... 他の人のファイル用ではありません。人々がそこに物を置くという悪い習慣に陥った唯一の理由は、それが常に検索パスにあり、多くのアプリ/モジュールが静的リンクを使用しているためです。(つまり、実際にそれに慣れると、本当の罪は静的リンクです-これはネイティブコードとマネージコードの罪です-常に常に動的にリンクします!)


9
+1 ...ただし、\ Program Files \ではなく%PROGRAMFILES%などの変数を使用する必要があることを追加します
Rod MacPherson

XPの時代には、開発者がレジストリをそのようなものに使用することは一般的な(そして推奨された)慣行でした。Windows 7では、これはもう当てはまりません!UAC、複数のユーザーセッションなどの理由により、Windows 7のレジストリは慎重に使用し、開発者の裁量で使用する必要があります。
ライカー、2014年

@RodMacPherson私の応答は、あなたの提案を考慮に入れるように強化されました。あなたは正しいです!
Jonesome Reinstate Monica

いくつか検討した結果、「%SYSTEMROOT%の下にファイルを配置する必要があるのはいつですか」という質問の答えが得られたと思います。決して。この回答はsyswow64フォルダーに関する好奇心を満たしていませんが、開発者が実際に読む必要のあるものです。
トーマス

7

同じ問題に遭遇し、これを数分間調査しました。

私はWindows 3.1とDOSを使用するように教えられました、当時を覚えていますか?しばらくの間、厳密にMacintoshコンピュータで作業した直後に、x64ビットマシンを購入した後、Windowsに戻り始めました。

これらの変更の背後には、プログラマーが作業を続けるために必要な実際の理由があります(歴史的意義があると言う人もいます)。

ほとんどの変更は上記のとおりです。

  • Program FilesProgram Files (x86)

    当初、16/86ビットのファイルは '86' Intelプロセッサで書かれていました。

  • System32本当に意味するSystem64(64ビットWindowsの場合)

    開発者が最初にWindows7での作業を開始したとき、他のアプリケーションが格納されている場所にいくつかの互換性の問題がありました。

  • SysWOW64 本当に意味する SysWOW32

    基本的には、英語で、「64ビットマシン内のWindows上のWindows」を意味します。各フォルダは、使用したいアプリケーションのDLLの場所を示しています。

以下は、必要なすべての基本情報を含む2つのリンクです。

これで問題が解決することを願っています!


4
真剣に受け止めたい場合は、スラングを下げて文法を改善する必要があります。また、段落を使用して、回答をもう少し構成することもできます。
Klas Mellbourn、2013年

2
@Crispyが答えを整理しました。将来的には、Klasの提案を検討し、賛成投票の可能性を高めるために応答をフォーマットする必要があります。:)
RekindledPhoenix 2013

OPは完全に書き直すか、削除する必要があります。それは誤解を招くものであり、実際には役に立ちません。
Jonesome Reinstate Monica 2013

5
SysWOW64は、実際には次の略語です。 、およびSystem64を作成した場合、互換性の問題は実際にはありません。MicrosoftがWoWサンドボックスで行っているのは、SysWoW64へのリクエストとして32ビットアクセスからSystem32へのメモリ内リダイレクトを作成することです。異なるプラットフォーム用に魔法のようにそれを魔法のように再マッピングする必要があるrawのファイルシステム?以前のコメント-Idiocyで述べたように
Armand

1
回答は質問の明確さよりも誤解を招きます、Armandsのコメントは良い説明です。
nahab 2016

5

System32はWindowsが歴史的にすべての32ビットDLLを配置した場所であり、システムは16ビットDLL用でした。マイクロソフトが64ビットOSを作成したとき、私が知っている誰もがファイルがSystem64の下にあると予想していましたが、Microsoftは64ビットファイルをSystem32の下に置く方が理にかなっていると判断しました。私が見つけることができた唯一の理由は、彼らが32ビットのすべてを64ビットのWindowsで動作させるためにプログラムの中で何かを変更する必要がないことを望んでいたということです-再コンパイルするだけで完了です。彼らがこれを解決して32ビットアプリケーションを引き続き実行できるようにする方法は、Windows64 On Windows64という32ビットWindowsサブシステムを作成することでした。そのため、32ビットサブシステムのSystemディレクトリにSysWOW64という頭字語が作成されました。SysはSystemの略で、WOW64はWindows32OnWindows64の略です。
Windows 16はWindows 32からすでに分離されているため、Windows 16 On Windows 64と同等のものは必要ありませんでした。32ビットサブシステム内では、プログラムがsystem32ディレクトリのファイルを使用する場合、実際にはSysWOW64ディレクトリからファイルを取得します。しかし、プロセスには欠陥があります。

それは恐ろしいデザインです。そして、私の経験では、64ビットアプリケーションを作成するために、さらに多くの変更を行う必要がありました。System64を読み取るようにSystem32ディレクトリを変更するだけで、非常に小さな変更になり、プリコンパイラディレクティブが処理するようになりました。


2

他の人々はすでにこの嘲笑の難問を説明するのに良い仕事をしています...そして、私はクリス・ホフマンがここでさらに良い仕事をしたと思います:https//www.howtogeek.com/326509/whats-the-difference-between-the- system32-and-syswow64-folders-in-windows /

私の2つの考え:

  1. 私たちは皆、人生で愚かな近視眼的ミスを犯します。マイクロソフトが(当時の)Win32 DLLディレクトリを「System32」と名付けたとき、それは当時は理にかなっています... 64ビット(または128ビット)バージョンの場合に何が起こるかを考慮していませんでした彼らのOSは後で開発されました-そして、そのようなディレクトリ名が引き起こす大きな後方互換性の問題。Hindsightは常に20〜20です。そのため、そのような間違いについては、あまり責任を負うことはできません。...しかし... Microsoftが後に64ビットオペレーティングシステムを開発したとき、後知恵の利点があっても、なぜまったく同じ近視の間違いを繰り返すだけでなく、意図的に与えることによってさらに悪化させるのかそれはそのような紛らわしい名前ですか?!?それらに恥!混乱を避けるために、少なくとも実際にディレクトリに「SysWin32OnWin64」という名前を付けないのはなぜですか。?そして、最終的に128ビットOSを作成するとどうなりますか?32ビット、64ビット、および128ビットDLLをどこに配置するのでしょうか。

  2. このロジックはすべて、まだ完全に欠陥があるようです。32ビットバージョンのWindowsでは、System32には32ビットDLLが含まれています。Windowsの64ビットバージョンでは、System32には64ビットDLLが含まれています...開発者がコードを変更する必要がないように正しいですか?このロジックの問題は、これらの開発者が64ビットのDLLを必要とする64ビットのアプリを作成している、または32ビットのDLLを必要とする32ビットのアプリを作成しているということです。つまり、まだ32ビットアプリを作成している場合、64ビットWindowsで実行するには、同じol '32ビットDLLを検索/参照するようにコードを変更する必要があります。以前使用されていました(現在はSysWOW64にあります)。または、64ビットアプリで作業している場合は、とにかく古いOSを新しいOS用に書き直す必要があるため、とにかく再コンパイル/再構築が必要になります。

マイクロソフトは時々私を傷つけます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.