我正在尝试使用与Windows相同的COM预览处理程序在我的应用程序中进行文件预览。我正在使用找到的代码here。在我的家庭计算机上,这适用于所有文件类型但是在工作时,创建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是使用应用程序GUID检索的Type
。我已经在网上和SO上看了一眼,尽管这个问题看起来很普遍,但我还是找不到解决方案。
答案 0 :(得分:5)
您在诊断此故障时遇到问题,因为崩溃的代码不是您的代码。您可以使用Regedit找回麻烦制造者,导航到HKLM \ Software \ Wow6432Node \ Classes \ CLSID并找到错误消息中报告的{guid}。您将看到它是由Adobe Reader提供的COM服务器,安装在我的计算机上的C:\ Program Files(x86)\ Adobe \ Reader 10.0 \ Reader \ pdfprevhndlr.dll中。
值得注意的是,您获得的COM错误代码通常与进程外COM服务器相关联,而注册的错误代码通常与进程内服务器相关。当它被配置为使用代理时会发生这种情况,代理是一个单独的进程,当您从64位进程使用它时,它为服务器提供兼容的主目录。这肯定会发生,寻找AppId {guid},你会看到那里提到的DllSurrogate值。它是32位预览主机进程c:\ windows \ syswow64 \ prevhost.exe。因此,诊断是 进程崩溃了。
Adobe Reader出现问题的情况并不少见。这是一个不久前进入终端阶段的程序,每个新版本都比以前的版本更糟糕。肯定看起来像Adobe失去了对它的控制,可能是一个不再可维护的代码库,而且没有足够的程序员在它上面工作,但仍然知道它是如何工作的。
首先查看Windows事件日志,应该对应用程序事件日志中的崩溃进行诊断。也许它会告诉你一些有用的东西。接下来要做的就是避免行使代理人的能力。将主EXE更改为32位进程。对于.NET应用程序,您可以使用Project + Properties,Build选项卡,将Platform目标从AnyCPU更改为x86。如果它仍然崩溃,那么至少你会更好地调试它,因为崩溃现在会发生在你的进程内部。重新安装Adobe Reader 可能提供缓解,尽管完全卸载它现在变得非常有吸引力的主张。
如果这只发生在用户的计算机上,那么你肯定有一个讨厌的支持问题。请使用更改的平台目标设置为其提供更新。如果这没有用,那么你几乎不得不建议他们在Adobe找到支持或者更新或卸载Reader。