使用64位regsvr32注册32位DLL

17
考虑以下理解:
  1. 32位进程不能加载64位dll,反之亦然。
  2. 为了注册/注销一个DLL,regsvr32在通过LoadLibrary将目标DLL加载到其地址空间后调用入口点DllRegisterServer / DllUnregisterServer
  3. 在64位系统上,32位版本的regsvr32位于C:\Windows\SysWOW64中。

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

输入图像描述

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

2个回答

14
似乎Mats和我假设的是正确的。微软已重新设计了64位regsvr32,以便根据目标dll位数产生新的32位regsvr32过程,从%SYSWOW64%注册DLL。为了证明这一点,我启动了procexp,在弹出的32位DLL窗口上进行了监视,以下是显示的内容。
需要注意的几点:
  1. 32位regsvr32的命令行与我试图注册的32位DLL名称相对应
  2. 32位版本的regsvr32是64位版本的regsvr32的子进程
  3. 图像类型和路径列

enter image description here


14

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


(来源:alax.info)

regsvr32会在内部启动与DLL位数相匹配的另一个兄弟进程。这就是注册成功的原因。您不需要关心您启动的是32位还是64位版本的regsvr32,因为它会自动处理匹配问题。

当您从Visual Studio作为调试主机启动regsvr32时,您需要注意正确的位数,因为实际注册的子进程将在调试器外部运行,您无法通过代码步骤来进行调试。


是的,那正是我想到的。谢谢你的努力。 - Abhijit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接