5

我们有一个用 Borland Delphi 制作的程序,它使用 Word 自动化来创建文档。在安装(终端服务器)上,我们只能在以本地管理员身份运行时让 Word 自动化工作。
当以另一个用户身份运行时,我们收到一条错误消息“Opdracht mislukt -2146824090”(它的荷兰语版本的 Office),我猜它被翻译为“操作失败”或“命令失败”。

用户对程序尝试放置新文档的文件夹具有读/写访问权限。

Office 2010
64 位 Windows server 2008 R2 标准

该应用程序是 32 位 Windows 应用程序。

如果我在创建 word.application 后添加延迟(500 毫秒),一切都会正常工作。

WordApp   := CreateOleObject('Word.Application');
sleep(500);
Doc := WordApp.documents.Open(sFile,EmptyParam,true);

任何人都知道为什么 CreateOleObject 命令现在在 Word 应用程序可以使用之前返回?

4

4 回答 4

1

如果您想追踪它,您可以使用ProcessMonitor之类的工具来追踪 Word 自动化执行,直到您可以使用该应用程序为止。

似乎正在进行某种权利检查 - 但半秒钟似乎太多了。

于 2010-10-26T16:16:42.760 回答
1

您可以尝试打开文档几次,或者 Word 在给出错误后完全无聊?

WordApp := CreateOleObject('Word.Application');

while True do
begin
  try
    Doc := WordApp.documents.Open(sFile,EmptyParam,true);
    Break;
  except
    on E: EOleSysError do
    begin
      // raise error if it's not the expected "Command failed" error
      if E.ErrorCode <> -2146824090 then
        raise;
    end;
  end;
end;

编辑:

在此处查看我的答案,它提供了更好的解决方案并解释了为什么会发生这种情况。

于 2011-01-04T10:40:45.990 回答
0

管理员帐户工作无延迟,似乎没有任何权限可做,但 Word 恰好使用此帐户启动比普通域用户帐户快得多。

我可以忍受延迟解决方法,但如果有人知道更好的方法,请告诉我。

于 2010-10-28T07:48:32.603 回答
0

我意识到这个线程已经很老了,但我通过确保在退出之前关闭文档(oleDocument.Close)解决了这个问题。这样就不需要任何类型的延迟等。请参阅下面的 Delphi 代码片段。

例子:

  oleWord     := Unassigned;
  oleDocument := Unassigned;

  Screen.Cursor := crHourGlass;

  try
    oleWord               := CreateOleObject('Word.Application');
    oleWord.Visible       := False;
    oleWord.DisplayAlerts := False;

    oleDocument := oleWord.Documents.Open(Worklist.Filename);
    oleDocument.SaveAs(Worklist.Filename, wdFormatDOSTextLineBreaks);

    oleDocument.Close;
    oleWord.Quit(False);
  finally
    oleDocument := Unassigned;
    oleWord     := Unassigned;

    Screen.Cursor := crDefault;
  end;
于 2016-04-05T19:03:24.517 回答