2010-01-22 89 views
2

我的应用程序需要注册两个COM DLL。如果用户具有必要的访问权限,它会自动完成,否则可以使用regsvr32完成。为什么我不能注册我的COM DLL?

现在在少数工作站出现以下情况:

  1. 开始cmd.exe作为管理员
  2. 注册第1个DLL:成功
  3. 注册第二个DLL:失败(0x80004005的,拒绝访问)

第一次向我报告这个错误时,我自动回答:“当然这不起作用,您需要管理员权限。”不用说,因为我试图自己注册这个DLL,所以我觉得非常尴尬......

这是什么原因:一个DLL可以注册,其他不可以。

一些背景资料:

  • 两个DLL是用Delphi 2005
  • 创建两个DLL中有非常简单的接口,只有极少数的类。
  • 有故障的机器,总是Vista或Windows 7

一般情况下我开始进程监视器,但我没有访问工作站之一,现在,所以我必须要收集尽可能多的信息尽可能直到我能掌握其中的一个。

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

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

换句话说(!):

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

什么可以引入这样的行为?!

+0

如果世界是公平的,所有工作站都会禁止COM注册=) – 2010-01-22 10:11:00

+0

为什么投票将它关闭为“属于serverfault?”我认为这里更适合。 – Shoban 2010-01-22 10:13:34

+0

可能是一个愚蠢的Q :)当你首先注册第二个DLL然后第一个DLL时发生? – Shoban 2010-01-22 10:14:01

回答

3

夫妇的事情,试图检查:

  1. 运行进程资源管理一台机器上其中两个DLL会成功注册并做雷吉·基斯和文件位置都的DLL触摸的比较快。有可能会有一些差异,可以解释这种行为
  2. 它总是相同的DLL失败?如果您颠倒注册顺序会发生什么?有可能第一个影响第二个(例如,通过在reg键上键入一个ACL)
  3. 收集一些关于这是32位还是64位问题的统计信息可能很有趣。 HKCU和HKLM在64位Vista和Win7上有一些具体的行为,可能会影响注册。
  4. 如果用户尝试将其注册为普通用户,并以管理员身份进行注册,则可以询问是否存在此问题。如果情况如此,HKLM虚拟化可能会发挥坏把戏。

更新

基于您的评论,它看起来失败注册尝试作为一个普通用户离开机器在搞砸状态。它可以在HKCU\Software\Classes(HKCR的每个用户映射)或HKCR\VirtualStore\MACHINE\SOFTWARE(虚拟HKLM)中找到。您需要准确确定注册失败后注册表中的内容。

我会在一台干净的机器上运行进程资源管理器,并尝试不升级注册来拍摄快照。

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

+0

第4点:这是最初的情况。我能做些什么来清理遗留下来的任何垃圾? – 2010-01-22 10:22:08

+0

取消注册为常规用户清理混乱。 – 2010-01-22 12:54:57

+0

在整个注册表中搜索DLL名称并进行清理。 – Shoban 2010-01-22 20:10:17