web-dev-qa-db-ja.com

32ビットの登録DLL 64ビットのregsvr32で

次の理解を考慮

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

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

enter image description here

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

15
Abhijit

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


(ソース: alax.info

regsvr32は、DLLのビット数と一致するように、内部で別のビット数ツインを開始します。これが登録が成功する方法です。 regsvr32の32ビットバージョンと64ビットバージョンのどちらを起動しても、不一致が処理されるため、気にする必要はありません。

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

10
Roman R.

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

注意すべきいくつかのこと

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

enter image description here

10
Abhijit