为什么我不能注册我的COM DLL?
我的应用程序需要注册两个COM DLL。如果用户具有必要的访问权限,它会自动完成,否则可以使用regsvr32
完成。为什么我不能注册我的COM DLL?
现在在少数工作站出现以下情况:
- 开始
cmd.exe
作为管理员 - 注册第1个DLL:成功
- 注册第二个DLL:失败(0x80004005的,拒绝访问)
第一次向我报告这个错误时,我自动回答:“当然这不起作用,您需要管理员权限。”不用说,因为我试图自己注册这个DLL,所以我觉得非常尴尬......
这是什么原因:一个DLL可以注册,其他不可以。
一些背景资料:
- 两个DLL是用Delphi 2005
- 创建两个DLL中有非常简单的接口,只有极少数的类。
- 有故障的机器,总是Vista或Windows 7
一般情况下我开始进程监视器,但我没有访问工作站之一,现在,所以我必须要收集尽可能多的信息尽可能直到我能掌握其中的一个。
UPDATE:我远程访问了一个失败的工作站。神秘的事情发生了:
- 启动进程监视器是不可能的(!)几秒钟后,Windows显示“内存不足”错误。
- 切换到不同的用户可以注册该DLL。
换句话说(!):
- 作为
UserA
登录,开始cmd.exe
作为管理员,regsvr32.exe
:失败 - 身份登录
UserB
,开始cmd.exe
作为管理员,regsvr32.exe
:成功
什么可以引入这样的行为?!
夫妇的事情,试图检查:
- 运行进程资源管理一台机器上其中两个DLL会成功注册并做雷吉·基斯和文件位置都的DLL触摸的比较快。有可能会有一些差异,可以解释这种行为
- 它总是相同的DLL失败?如果您颠倒注册顺序会发生什么?有可能第一个影响第二个(例如,通过在reg键上键入一个ACL)
- 收集一些关于这是32位还是64位问题的统计信息可能很有趣。 HKCU和HKLM在64位Vista和Win7上有一些具体的行为,可能会影响注册。
- 如果用户尝试将其注册为普通用户,并以管理员身份进行注册,则可以询问是否存在此问题。如果情况如此,HKLM虚拟化可能会发挥坏把戏。
更新
基于您的评论,它看起来失败注册尝试作为一个普通用户离开机器在搞砸状态。它可以在HKCU\Software\Classes
(HKCR的每个用户映射)或HKCR\VirtualStore\MACHINE\SOFTWARE
(虚拟HKLM)中找到。您需要准确确定注册失败后注册表中的内容。
我会在一台干净的机器上运行进程资源管理器,并尝试不升级注册来拍摄快照。
另外,尝试让机器处于这种状态,然后运行未升高的取消注册。在理想情况下,这应该“修复”机器。如果这样做,您可以在正在进行适当修复时为您的用户提供快速解决方法。
第4点:这是最初的情况。我能做些什么来清理遗留下来的任何垃圾? – 2010-01-22 10:22:08
取消注册为常规用户清理混乱。 – 2010-01-22 12:54:57
在整个注册表中搜索DLL名称并进行清理。 – Shoban 2010-01-22 20:10:17
如果世界是公平的,所有工作站都会禁止COM注册=) – 2010-01-22 10:11:00
为什么投票将它关闭为“属于serverfault?”我认为这里更适合。 – Shoban 2010-01-22 10:13:34
可能是一个愚蠢的Q :)当你首先注册第二个DLL然后第一个DLL时发生? – Shoban 2010-01-22 10:14:01