【问题标题】:"Creating an Instance of COM Component failed" when porting from Win XP to Win7从 Win XP 移植到 Win7 时“创建 COM 组件实例失败”
【发布时间】:2012-09-04 06:09:34
【问题描述】:

我开发了一个带有线程的 C# 应用程序,可以将 word 转换为 pdf。
此应用程序在带有 Office 2007 的 Win XP 中运行良好。但是在带有 Office 2010 的 Win7 上使用它时会引发错误:

由于以下错误,从 IClassFactory 创建 CLSID 为 {00020906-0000-0000-C000-000000000046} 的 COM 组件实例失败:8001010a。

你能告诉我如何让 Win7 运行我的应用程序吗?

【问题讨论】:

  • 这似乎是在同一台机器上运行的防病毒软件的问题 - 请参阅thread 更具体地说,该问题与被锁定的 DLL 有关(这可能是由防病毒软件引起的)病毒运行)。问题很可能是您的文件被一个线程锁定并试图通过另一个线程访问它们。
  • 我认为这不是问题,因为我的系统还安装了 symentech 端点防病毒软件
  • 如果我在单线程中运行程序,它会运行,但如果我提供的更多,它就不起作用。即使我禁用了防病毒软件。所有 word 文档都在共享位置
  • 查看我的更新答案。你没有说你正在尝试做什么或提供任何代码,因此我的回答不能比它更详细。
  • 嗨,詹姆斯,我在 winxp 中运行相同的应用程序,并且工作正常。两台机器都具有相同的防病毒软件。 winxp 可以通过共享位置访问,但是 win7 无法正常访问。这是我的疑问

标签: c# windows-7 windows-xp


【解决方案1】:

错误代码 0x8001010a 是 RPC_E_SERVERCALL_RETRYLATER,“被调用的对象现在选择不处理调用。稍后再试。” Office 应用程序并不少见。你应该睡一会再试。

使用最强烈的轻描淡写,这并不是很实用。最终,它是由您在代码中使用线程引起的。 Office 对象是单线程的。您当然可以在工作线程上进行方法调用,但 COM 会自动将调用编组到创建对象的 STA 线程。基本上消除了多线程的所有优点。如果您创建自己的 STA 线程来避免这种情况,那么封送处理将在 Office 应用内完成。

这就是成本停止的地方,如果您拨打电话并且应用程序还没有准备好执行该方法,因为它正忙于做其他事情(通常是您之前要求它做的任何事情),那么它将拒绝使用此错误代码调用。究竟什么时候你会得到错误是高度不可预测的,版本更改肯定会产生不同的行为。您必须降低代码中的线程,以避免如此猛烈抨击它。

或者实现 IMessageFilter 接口并告诉 COM 你的程序挂在调用上是可以的,它应该继续等待,直到 Office 应用准备好处理调用。 This Q+A 谈论它。

【讨论】:

    猜你喜欢
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多