C++ 使用64位regsvr32注册32位DLL

C++ 使用64位regsvr32注册32位DLL,c++,windows,com,rpc,C++,Windows,Com,Rpc,考虑到以下理解: 32位进程无法加载64位dll,反之亦然 对于注册/注销DLL,在通过LoadLIbrary将目标DLL加载到其地址空间后,调用入口点DllRegisterServer/DllUnregisterServer 在64位系统上,32位版本的regsvr32出现在C:\Windows\SysWOW64 但是在我的2008 R2机器上,我能够通过64位regsvr32注册一个32位dll。这怎么可能?我错过什么了吗 我想在截图中突出显示的示例是最后一个弹出对话框的示例。看来Mats

考虑到以下理解:

  • 32位进程无法加载64位dll,反之亦然
  • 对于注册/注销DLL,在通过
    LoadLIbrary
    将目标DLL加载到其地址空间后,调用入口点
    DllRegisterServer
    /
    DllUnregisterServer
  • 在64位系统上,32位版本的regsvr32出现在
    C:\Windows\SysWOW64
  • 但是在我的2008 R2机器上,我能够通过64位regsvr32注册一个32位dll。这怎么可能?我错过什么了吗


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

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

    需要注意的几件事

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

  • 这应该准确地解释它是如何发生的:


    (来源:)

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


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

    是的,这就是我的想法。谢谢你的努力。