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

StackOverflow https://stackoverflow.com/questions/949959

質問

いつファイルを次の場所に置く必要があるのか​​知りたいです

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

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

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

驚いたことに、それは 逆に!の 32-ビット 1 は C:\Windows\SysWOW に配置されます64, 、 そしてその 64-bit DLL は C:\Windows\System に配置されます32.

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

役に立ちましたか?

解決

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

SysWoW64 は 64 ビット システムの DLL を対象としたものではなく、実際には「Windows on Windows64」のようなもので、64 ビット Windows 上で 32 ビット アプリを実行するために必要なビットを意味します。

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

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

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

他のヒント

次のように付け加えておきます。とにかく、dll を \system32\ に入れるべきではありません。コードを変更し、インストーラーを変更します...c:\windows\ の下にないビットのホームを見つけてください。

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

\program files\<your app dir>\

or

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

(注記: 実際にこれを行う方法 環境変数を使用することです:%プログラムファイルがどこにあるかを見つけるためのプログラムファイル%または%プログラムファイル(x86)%...それが c:\program files\ ....であるとは想定しません。)

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

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

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

上記が賢い方法です。

自分の DLL やサードパーティの DLL を \system32\ や \syswow64 にインストールしないでください。静的にロードする必要がある場合は、DLL を exe ディレクトリ (DLL が存在する場所) に置きます。exe ディレクトリを予測できない場合 (例:他の exe があなたの DLL を呼び出そうとしている場合)、DLL ディレクトリを検索パスに入れる必要がある場合があります (可能な場合は避けてください)。

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

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

私は Windows 3.1 と DOS の使い方を教えられました。当時のことを覚えていますか?その後しばらくの間、私は Macintosh コンピュータだけを使って仕事をしていましたが、x64 ビット マシンを購入した後は Windows に戻り始めました。

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

変更点のほとんどは上記で説明したとおりです。

  • Program FilesProgram Files (x86)

    当初、16/86 ビット ファイルは「86」インテル プロセッサーに書き込まれていました。

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

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

  • SysWOW64 本当に意味する SysWOW32

    要するに、平易な英語で言うと、 「64 ビット マシン内の Windows 上の Windows」. 。各フォルダーは、使用するアプリケーションの DLL がどこにあるかを示します。

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

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

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

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

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

私の二つの考え:

  1. 私たちは皆、人生において愚かで近視眼的な間違いを犯します。Microsoft が (当時の) Win32 DLL ディレクトリを「System32」と名付けたとき、それは当時としては理にかなっていました...彼らは、OS の 64 ビット (または 128 ビット) バージョンが後で開発された場合に何が起こるか、そしてそのようなディレクトリ名が引き起こす大規模な下位互換性の問題を考慮していませんでした。結果論では常に20対20なので、そのような間違いについて彼らを(あまり)責めることはできません。...しかし...後に Microsoft が 64 ビット オペレーティング システムを開発したとき、後知恵ではあったとしても、なぜ彼らはまったく同じ近視眼的な間違いを再び犯しただけでなく、意図的にそのような誤解を招く名前を付けてさらに事態を悪化させたのでしょうか?! ?彼らは恥を知れ!混乱を避けるために、少なくとも実際にディレクトリに「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 で実行するには、コードを変更して、同じ古い 32 ビット DLL を検索/参照する必要があります。以前に使用されていました (現在は SysWOW64 にあります)。あるいは、64 ビット アプリを開発している場合は、とにかく新しい OS 用に古いアプリを書き直す必要があります...したがって、とにかく再コンパイル/リビルドが必要になります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top