17

考虑到以下理解

  1. 32 位进程无法加载 64 位 dll,反之亦然。
  2. 为了注册/注销一个 DLL ,regsvr32在将目标 DLL 通过.DllRegisterServerDllUnregisterServerLoadLIbrary
  3. 在 64 位系统上,32 位版本的 regsvr32 存在于C:\Windows\SysWOW64

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

在此处输入图像描述

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

4

2 回答 2

13

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


(来源:alax.info

regsvr32将在内部启动它的另一个位双胞胎以匹配 DLL 的位。这样注册就成功了。您不需要关心是启动 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 回答