为什么我不能注册我的COM DLL?

时间:2010-01-22 10:02:26

标签: com activex

我的应用程序需要注册两个COM DLL。如果用户具有必要的访问权限,则会自动完成,但是可以使用regsvr32完成。

现在在几个工作站上会发生以下情况:

  1. 以管理员身份启动cmd.exe
  2. 注册第一个DLL:成功
  3. 注册第二个DLL:失败(0x80004005,拒绝访问)
  4. 第一次向我报告此错误时,我自动回复:“当然它不起作用,您需要管理员权限。”毋庸置疑,当我试图自己注册DLL时,我感到非常尴尬......

    原因可能是:一个DLL可以注册,另一个不能注册。

    一些背景资料:

    • 这两个DLL都是使用Delphi 2005创建的。
    • 这两个DLL都有非常简单的接口,只有非常少的类。
    • 失败的机器总是Vista或Windows 7。

    通常我会启动Process Monitor,但我现在无法访问其中一个工作站,所以我必须收集尽可能多的信息,直到我能够接触到其中一个。

    更新:我远程访问了其中一个失败的工作站。神秘的事情发生了:

    • 无法启动进程监视器(!)几秒钟后,Windows显示“内存不足”错误。
    • 切换到其他用户可以注册DLL。 (!)

    换句话说:

    • UserA身份登录,以管理员身份cmd.exe启动regsvr32.exe:失败
    • UserB身份登录,以管理员身份cmd.exe开始regsvr32.exe:成功

    什么可以引入这种行为?!

1 个答案:

答案 0 :(得分:3)

要尝试检查的事情:

  1. 在两台dll都将成功注册的机器上运行进程资源管理器,并快速比较两个DLL触摸的注册表项和文件位置。可能会有一些差异可以解释这种行为
  2. 是否总是失败了?如果您颠倒注册顺序会怎样?第一个可能影响第二个(例如,通过在reg密钥上设置ACL)
  3. 收集一些关于这是32位还是64位问题的统计信息可能会很有趣。 HKCU和HKLM在64位Vista和Win7上的行为有某些细节,可能会影响注册。
  4. 如果用户在作为管理员执行此操作之前尝试注册为常规用户,请询问用户是否遇到此问题。如果是这种情况,HKLM虚拟化可能会发挥不好的伎俩。
  5. <强>更新

    根据您的评论,它看起来作为普通用户的失败注册尝试使机器处于混乱状态。它可以是HKCU\Software\Classes(HKCR的每用户映射)或HKCR\VirtualStore\MACHINE\SOFTWARE(虚拟化HKLM)。您需要准确确定注册尝试失败后注册表中剩下的内容。

    我会在干净的计算机上运行进程资源管理器,并尝试非提升注册来拍摄快照。

    此外,尝试让机器处于这种状态,然后运行非提升的取消注册。在理想情况下,这应该“修复”机器。如果可行,您可以在进行正确修复时为用户提供快速解决方法。

相关问题