2011-07-09 70 views
1

我正在构建一个使用Visual Studio 2008部署(安装)项目的安装程序。该项目具有“特权”启动条件,以便只有管理员才能运行它。它使用由第三方提供的合并模块来注册COM组件。 COM组件是通过一个.NET interop DLL公开的,而这个DLL又被我为其构建安装程序的程序使用。 (细节:这是一个安装QBFC框架的Intuit合并模块)。COM组件如何注册到一半?

安装完成后,COM组件无法加载。错误是“班级未注册”。但是当我进入注册表时,我可以看到所有正确的条目都在HKEY_CLASSES_ROOT\CLSID\{the class id}之下 - 其中类ID与错误消息的类ID相匹配。如果我然后在管理模式下打开命令提示符并重新注册DLL服务器使用Regsvr32,一切都是固定的,但我看不到任何变化KEY_CLASSES_ROOT\CLSID

当我检查系统使用进程监视器得到类未注册的错误,我可以看到应用程序在尝试打开CLSID时收到“找不到名称”的错误,即使CLSID肯定存在(我有双重检查和三重检查)。我认为这必须与权限有关。另一种理论认为,“未注册的类”消息可能来自于依赖组件,但这并不能解释我在进程监视器中看到的内容。

所有这些测试结果来自Windows 7旗舰版32位操作系统。

你会采取什么步骤来解决这个问题的底部?

+0

查看HKLM \ Software \ Wow6432Node \ Classes \ CLSID。 32位COM注册键的主页。 –

+0

汉斯,这是一个很好的接触,但我忘了提及我的测试结果来自32位图像。 –

+0

如果“32位图像”意味着一个32位的COM服务器,那么你一定想看看Wow6432Node。避免让我们猜测重要的细节,比如你是否在64位操作系统上运行它。 –

回答

2

有一件事情可能是组件类别缓存存在问题。这是一个很长的一步,但如果你添加一个步骤来安装删除HKEY_CLASSES_ROOT\Component Categories\下的密钥,它有帮助吗?如果是这样,你需要找出你需要删除哪个comcat缓存(即你的对象正在使用哪个缓存)。

你可以做的另一件事是导出整个注册表,做你的安装,导出注册表,做regsvr32的事情,导出注册表。然后对输出的注册表文件的每个修订版进行加密。这可能会让你知道至少发生了什么变化。

最后,如果是64位机器,请确保您正确地进行64位注册。

+1

导出整个注册表并执行差异是将其整理出来的。这使我意识到我的注册表知识已过时。例如,HKEY_CLASSES_ROOT键现在通过合并来自其他源键的数据完全模拟,具体取决于用户上下文。执行完整的注册表导出显示注册发生在当前用户配置单元中,而不是它们所属的HKEY_LOCAL_MACHINE \ Software \ Classes中。 –

+0

是的,MSDN上有一些关于此的好文章。例如,http://msdn.microsoft.com/en-us/library/aa965884(v=vs.85).aspx –

+1

另请参阅http://msdn.microsoft.com/en-us/library/windows/desktop /ms724498(v=vs.85).aspx –