0

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

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

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

4

1 回答 1

3

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

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

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

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

于 2012-09-11T11:20:30.973 回答