web-dev-qa-db-ja.com

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

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

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

DLLが2つありました。1つは32ビット用、もう1つは64ビット用です。

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

驚いたことに、それは2-bit 1はC:\ Windows\SysWOWに入ります64、および64-bit DLLはC:\ Windows\Systemに入ります32

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

216
Ganesh Astroved

System32の名前を変更することが目的だったと思いますが、そのパスに対して非常に多くのアプリケーションがハードコードされているため、削除することはできませんでした。

SysWoW64は64ビットシステムのdll向けではなく、実際には「Windows64上のWindows」のようなものです。つまり、64ビットウィンドウで32ビットアプリを実行するために必要なビットです。

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

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

編集:インストーラーについて話している場合、本当にすべきではないパスをハードコードするシステムフォルダに。代わりに、インストーラーがエミュレーションレイヤーで実行されているかどうかに基づいて、Windowsが自動的に処理するようにします。

215
Rytmis

追加する必要があります:いずれにしても、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が提供するファイル用です... 他のファイル用ではありません。人々がそこに物を置くという悪い習慣になった唯一の理由は、それが常に検索パスにあり、多くのアプリ/モジュールが静的リンクを使用しているからです。 (したがって、実際にそれを理解する場合、本当の罪は静的リンクです-これはネイティブコードとマネージコードの罪です-常に常に動的にリンクします!)

23
Jonesome

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

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

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

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

  • Program Files vs Program Files (x86)

    最初は16/86ビットファイルが書き込まれた「86」Intelプロセッサ。

  • System32は実際にはSystem64を意味します(64ビットWindowsの場合)

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

  • SysWOW64は本当にSysWOW32を意味します

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

必要なすべての基本情報を含む2つのリンクを次に示します。

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

6
Crispy

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

それは恐ろしいデザインです。そして、私の経験では、64ビットアプリケーションを書くためにもっと多くの変更をしなければなりませんでした。System32ディレクトリを変更してSystem64を読むだけで、非常に小さな変更になります。

5
Armand

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

私の2つの考え:

  1. 私たちは皆、人生で愚かな近視眼的な過ちを犯します。 Microsoftが(当時の)Win32DLLディレクトリを「System32」と命名したとき、それは意味がありました...彼らは64ビット( (128ビット)バージョンのOSが後で開発されました-そして、このようなディレクトリ名が原因で発生する大規模な後方互換性の問題。後知恵は常に20〜20であるため、このような間違いを(あまりにも)非難することはできません。 ...しかし... Microsoftが後知恵の恩恵を受けて64ビットオペレーティングシステムを開発したとき、なぜまったく同じ近視眼的ミスを繰り返しただけでなく、目的をさらに与えることでさらに悪化させたのでしょうか?それはそのような紛らわしい名前ですか?!?それらに恥を!なぜAT混乱を避けるために、実際にはディレクトリに「SysWin32OnWin64」という名前を付けないのですか?!?そして、最終的に128ビットOSを生成するとどうなりますか?そして、32ビット、64ビット、128ビットのDLLをどこに配置するのでしょうか?!?

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

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

1
Rich Bayless