Windows Server 2012 R2 Standardを実行している特定のマシンで、32ビットWin32コンソールアプリケーションがkernel32.dllの64ビットバージョンをロードしていることがあります。Win32 32ビットプロセスが64ビットkernel32.dllをロードする
それは正しく、他のマシン上で32ビットのカーネル32をロードします。それはこのようになりますシンプルなHelloWorldのアプリケーションでDependency Walkerを使用して
。
PATH
の値が同一でないので、もし、少なくとも異なるマシン上で正確に同じ順序に関連するパスを含むと思われます。
マイクロソフトからthis pageによれば、DLLの検索順序は次のとおり
- 現在のプロセスの実行可能モジュールが配置されているディレクトリ。
- 現在のディレクトリ。
- Windowsのシステムディレクトリ。
GetSystemDirectory
関数は、このディレクトリのパスを取得します。 - Windowsディレクトリ。
GetWindowsDirectory
関数は、このディレクトリのパスを取得します。 - 環境変数
PATH
にリストされているディレクトリ。
私はWindows/system32
代わりのWindows/SysWOW64
へのパスを返すか、32ビットプロセスのためのsystem32
からSysWOW64
へのマッピングが正常に動作していないが、これらは、資格の推測であることをGetSystemDirectory
この特定のマシンであることを推測しています。
この現象の原因は何ですか?
これはDependency Walkerの間違いではありません。 32ビットアプリケーションは静的インポートによってkernel32.dllの64ビットバージョンをロードしません。 path/GetSystemDirectoryは '\ KnownDlls32 \ kernel32.dll'セクションが常に存在するため、ここでは関係ありません。それは使用されます – RbMm
Dependency Walkerが幾分信頼できるように最後に働いたのはWindows Vistaでした。 Dependency WalkerのWindows 7以降のOSで、混乱している/誤解を招くような情報を表示する準備をしてください。DLLの問題を診断するには、[ローダースナップを有効にする](https://docs.microsoft.com/en-us/windows) -hardware/drivers/debugger/show-loader-snap)を実行します。 – IInspectable