234

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

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

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

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

驚いたことに、それは逆です!32ビット DLLはC:\Windows\SysWOW 64に入り、64ビット DLL は C:\Windows\System 32に入ります。

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

4

5 に答える 5

231

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

SysWoW64 は 64 ビット システムの dll 用ではありませんでした。実際には「Windows on Windows64」のようなもので、64 ビット Windows で 32 ビット アプリを実行するために必要なビットを意味します。

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

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

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

于 2009-06-04T11:40:40.683 に答える
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 に動的にリンクします。

以上が賢い方法です。

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

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

于 2013-01-21T20:35:52.313 に答える
5

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

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

于 2016-06-14T23:18:40.463 に答える
2

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

私の2つの考え:

  1. 私たちは皆、人生でばかげた近視眼的な過ちを犯します。Microsoft が (当時の) Win32 DLL ディレクトリに「System32」という名前を付けたとき、それは当時としては理にかなっていました...彼らは、64 ビット (または 128 ビット) バージョンの場合に何が起こるかを考慮していませんでした。彼らの OS は後で開発されました - そして、そのようなディレクトリ名が引き起こすであろう大規模な後方互換性の問題。後知恵は常に 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 で実行するには、同じ古い 32 ビット DLL を検索/参照するようにコードを変更する必要があります。以前に使用されていました (現在は SysWOW64 にあります)。または、64ビットアプリで作業している場合、とにかく新しいOS用に古いアプリを書き直す必要があります...とにかく、再コンパイル/再構築が必要になります!!

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

于 2019-04-01T00:33:50.240 に答える