【问题标题】:Microsoft.Office.Interop.Word "Cannot activate application"Microsoft.Office.Interop.Word“无法激活应用程序”
【发布时间】:2011-03-22 17:33:58
【问题描述】:

一些用户在尝试通过 office interop 从我们的应用程序启动 Word 时遇到问题:

using Word = Microsoft.Office.Interop.Word;

public void ShowWord()
{
  _word = new Word.ApplicationClass();
  _word.Visible = true;
  _word.Activate();
}

如果 word 未始终打开,则会引发 COM 异常,说明“无法激活应用程序”。在调用_word.Activate() 之前添加Thread.Sleep(1000) 可以防止这种情况,但显然并不理想。

public void ShowWord()
{
  _word = new Word.ApplicationClass();
  _word.Visible = true;
  Thread.Sleep(1000)
  _word.Activate();
}

以前有没有人见过这个并且知道是什么原因造成的以及解决这个问题的正确方法是什么?

【问题讨论】:

  • 来自 MSDN:ApplicationClass 类支持 .NET Framework 基础结构,不能直接从您的代码中使用。它可能证明与您的问题无关,但您仍然应该停止使用。请改用Application
  • 是的,我也对ApplicationClass 的这种用法感到困惑。这是一段相当古老的代码;我会看看Application 看看是否能解决问题。
  • 我已将所有内容更改为Application,但完全没有区别。

标签: c# vsto office-interop


【解决方案1】:

我们遇到了类似的问题,Word 似乎正在异步等待操作系统显示其窗口。我们解决这个问题的方法是等到 Visible 属性返回 true:

public void ShowWord()
{
  _word = new Word.Application();
  _word.Visible = true;

  System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
  while (!_word.Visible && sw.ElapsedMilliseconds < 10000)
  { /* Just Wait!! (at most 10s) */}
  _word.Activate();
}

希望这对某人有所帮助。

【讨论】:

  • 没有测试过,因为这是很久以前的事了,但我会接受,因为这听起来很合理:)
【解决方案2】:

您的应用程序是否有权激活 Word COM 对象?

查看DCOMCNFG 本地激活安全要求是什么。

但是,不确定为什么您的Thread.Sleep(1000)会允许它工作?

【讨论】:

  • 是的,这不是权限问题。这与对象需要时间在内部进行初始化有关。所以我希望new 是同步的。但它似乎是异步的。
  • AFAIK,通过互操作对 COM 的调用被序列化为单个线程,这会使异步行为有点奇怪。是否有任何内容写入事件日志?
  • 不,事件日志中没有任何内容。
  • 我只能认为 Thread.Sleep(1000) 就像你说的那样,允许上下文切换回 COM 互操作线程,然后完成它的初始化,然后再交回你的 Activate 调用调用线程。如果您调试,您会在“线程”窗口中看到什么?
  • 这就是问题所在,我们无法在开发机器上重现此问题;它只出现在我们的几台笔记本电脑上。我们用其中一台笔记本电脑制作了一个虚拟机,并在开发机器上运行,但我不知道如何附加到该进程。
猜你喜欢
  • 2012-05-17
  • 2012-03-15
  • 1970-01-01
  • 2011-07-24
  • 2019-07-31
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多