代码之家  ›  专栏  ›  技术社区  ›  Abhijit

使用64位regsvr32注册32位DLL

  •  17
  • Abhijit  · 技术社区  · 12 年前

    考虑以下理解

    1. 32位进程无法加载64位dll,反之亦然。
    2. 用于注册/注销DLL regsvr32 调用入口点 DllRegisterServer / DllUnregisterServer 通过将目标DLL加载到其地址空间后 LoadLIbrary .
    3. 在64位系统上,32位版本的regsvr32存在于 C:\Windows\SysWOW64

    但后来在我的2008 R2 Box上,我能够通过64位regsvr32注册一个32位dll。这怎么可能?我是不是错过了什么?

    enter image description here

    我想在屏幕截图中突出显示的例子是最后一个弹出对话框的例子。

    2 回复  |  直到 6 年前
        1
  •  14
  •   Community Mohan Dere    6 年前

    这应该解释它是如何发生的:


    (来源: alax.info )

    regsvr32 将在内部启动另一个bitness孪晶,以匹配DLL的bitness。这就是注册成功的方式。您不需要关心是启动32位版本还是64位版本的 寄存器32 因为它会处理不匹配。

    你需要关心的情况是当你开始的时候 寄存器32 从Visual Studio作为调试主机。您需要正确的比特率,因为具有实际注册的子进程将在调试器之外运行,并且您将无法逐步执行代码。

        2
  •  14
  •   Abhijit    12 年前

    看来Mats和我的假设是正确的。MS重新设计了64位regsvr32,以便根据目标dll的位数,它可以从%SYSWOW64%生成一个新的32位regsvr32进程来注册dll。为了证明这一点,我启动了procexp,查看了32位DLL的弹出窗口,结果如下。

    需要注意的几件事

    1. 32位regsvr32的命令行映射了我试图注册的32位DLL名称
    2. 32位版本的regsvr32是64位版本的regsvr32的子进程
    3. 图像类型和路径列

    enter image description here

    推荐文章