0

我正在尝试通过使用与 windows 相同的 COM 预览处理程序在我的应用程序中进行文件预览。我正在使用此处找到的代码。在我的家用机器上,这适用于所有文件类型,但是在工作中,创建 COM 处理程序的实例在大多数情况下会引发以下错误:

System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM 
class factory for component with CLSID {DC6EFB56-9CFA-464D-8880-44885D7DC193}
failed due to the following error: 80080005 Server execution failed (Exception
from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).

引发错误的代码是:

object previewer = Activator.CreateInstance(type);

其中 type 是Type使用应用程序 GUID 检索的。我在网上和 SO 上都看过了,虽然这个问题看起来很普遍,但我一直没能找到解决方案。

4

1 回答 1

5

您在诊断此故障时遇到问题,因为崩溃的不是您的代码。您可以使用 Regedit 找回麻烦制造者,导航到 HKLM\Software\Wow6432Node\Classes\CLSID 并找到错误消息中报告的 {guid}。你会看到它是一个由 Adob​​e Reader 提供的 COM 服务器,安装在我机器上的 C:\Program Files (x86)\Adobe\Reader 10.0\Reader\pdfprevhndlr.dll 中。

值得注意的是,您会得到一个 COM 错误代码,该代码通常与进程外 COM 服务器相关联,而注册的 COM 错误代码在很大程度上是进程内服务器。当它被配置为使用代理时可能会发生这种情况,代理是一个单独的进程,当您从 64 位进程中使用它时,它会为服务器提供一个兼容的主目录。这肯定会发生,查找 AppId {guid},您会看到那里提到的 DllSurrogate 值。它是 c:\windows\syswow64\prevhost.exe,32 位预览主机进程。所以诊断是那个进程崩溃了。

Adobe Reader 出现问题并不少见。这是一个前段时间进入终端阶段的程序,每个新版本都比以前的版本差。在我看来,它确实看起来像 Adob​​e 失去了对它的控制,可能是因为代码库不再可维护,并且没有足够的程序员在处理它仍然知道它是如何工作的。

首先查看 Windows 事件日志,应用程序事件日志中应该有关于崩溃的诊断。也许它会告诉你一些有用的东西。接下来要做的是避免行使代孕的能力。将您的主 EXE 更改为 32 位进程。对于 .NET 应用程序,您可以使用 Project + Properties,Build 选项卡,将 Platform target 从 AnyCPU 更改为 x86。如果它仍然崩溃,那么至少你可以更好地调试它,因为崩溃现在将发生在你的进程内部。重新安装 Adob​​e Reader可能会带来缓解,尽管如今完全卸载它已成为一个非常有吸引力的提议。

如果这只发生在您用户的机器上,那么您肯定遇到了令人讨厌的支持问题。请使用更改后的平台目标设置向他们提供更新。如果这没有帮助,那么您几乎只能建议他们在 Adob​​e 寻求支持或更新或卸载 Reader。

于 2013-06-24T10:43:25.100 回答