用64位regsvr32注册一个32位的DLL

考虑以下的理解

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

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

在这里输入图像说明

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

http://alax.info/blog/wp-content/uploads/2009/11/01-Image002.png

regsvr32将启动它的内部另一位双胞胎来匹配DLL的位数。 这是注册成功的方式。 您无需关心是否启动32位或64位版本的regsvr32因为它会处理不匹配。

您需要注意的情况是从Visual Studio启动regsvr32作为调试主机。 你需要正确的位,因为实际注册的子进程会在调试器之外运行,你将无法通过代码。

似乎Mats和我的假设是正确的。 MS已经重新设计了64位regsvr32,以便根据目标dll位的不同,它可以从%SYSWOW64%产生一个新的32位regsvr32进程来注册该DLL。 为了证明这一点,我启动了procexp,窥探了32位DLL的弹出窗口,这就是显示的内容。

几件事要注意

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

在这里输入图像说明