繁体   English   中英

使用 64 位 regsvr32 注册 32 位 DLL

[英]Registering a 32 bit DLL with 64 bit regsvr32

考虑以下理解

  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。 那怎么可能? 我错过了什么吗?

在此处输入图片说明

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

Mats 和我的假设似乎是正确的。 MS 重新设计了 64 位 regsvr32,以便根据目标 dll 位数,它可能会从 %SYSWOW64% 生成一个新的 32 位 regsvr32 进程来注册 DLL。 为了证明这一点,我启动了 procexp,监视 32 位 DLL 的弹出窗口,这是显示的内容。

需要注意的几件事

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

在此处输入图片说明

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


(来源: alax.info

regsvr32将在内部启动它的另一个位孪生以匹配 DLL 的位。 这样注册就成功了。 您无需关心是启动 32 位还是 64 位版本的regsvr32因为它会处理不匹配问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM