17

次の理解を考慮して

  1. 32 ビットのプロセスは 64 ビットの dll をロードできません。また、その逆も同様です。
  2. DLL を登録/登録解除するには、を介してターゲット DLL をそのアドレス空間にロードした後regsvr32、エントリ ポイントDllRegisterServer/を呼び出します。DllUnregisterServerLoadLIbrary
  3. 64 ビット システムでは、32 ビット バージョンの regsvr32 がC:\Windows\SysWOW64

しかし、2008 R2 ボックスでは、64 ビット regsvr32 で 32 ビット dll を登録できました。それはどのように可能でしたか?何か不足していますか?

ここに画像の説明を入力

スクリーンショットで強調したかった例は、ダイアログがポップアップする最後の例です。

4

2 に答える 2

13

これは、それがどのように起こるかを正確に説明するはずです:


(出典: alax.info )

regsvr32DLL のビット数と一致するように、別のビット数ツインを内部的に開始します。こんな感じで登録成功です。32 ビット バージョンと 64 ビット バージョンのどちらを起動するかを気にする必要はありませんregsvr32

注意が必要なシナリオは、regsvr32デバッグ ホストとして Visual Studio から開始する場合です。実際に登録された子プロセスはデバッガーの外部で実行され、コードをステップスルーできないため、正しいビット数が必要です。

于 2013-09-22T07:57:57.263 に答える
13

マッツと私の推測は正しかったようです。MS は 64 ビット regsvr32 を再設計したため、ターゲット dll のビット数に基づいて、%SYSWOW64% から新しい 32 ビット regsvr32 プロセスを生成して DLL を登録できます。この点を証明するために、私は procexp を起動し、32 ビット DLL のポップアップ ウィンドウをスパイしました。

いくつかの注意事項

  1. 32 ビット regsvr32 のコマンド ラインは、登録しようとしていた 32 ビット DLL 名にマップされます。
  2. regsvr32 の 32 ビット バージョンは、regsvr32 の 64 ビット バージョンの子プロセスです。
  3. 画像タイプとパス列

ここに画像の説明を入力

于 2013-09-21T17:53:11.233 に答える