Delphi Word automation仅适用于管理员,或在创建Word.application后延迟

Delphi Word automation仅适用于管理员,或在创建Word.application后延迟,delphi,ms-word,automation,administrator,office-2010,Delphi,Ms Word,Automation,Administrator,Office 2010,我们有一个用Borland Delphi编写的程序,它使用Word自动化创建文档。 在安装(终端服务器)上,我们只能在以本地管理员身份运行时才能使用“自动化”一词。 当作为另一个用户运行时,我们会收到一条错误消息“Opdracht mislukt-2146824090”(荷兰语版本的Office),我猜这条消息会被翻译为“操作失败”或“命令失败” 用户对程序尝试放置新文档的文件夹具有读/写权限 Office 2010 64位Windows server 2008 R2标准 应用程序是32位win

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

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

Office 2010
64位Windows server 2008 R2标准

应用程序是32位windows应用程序

如果在创建word.application后添加延迟(500ms),则一切正常

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

有人知道为什么CreateOleObject命令现在在使用Word应用程序之前返回吗

如果你想了解这一点,你可以使用一个工具,比如跟踪单词automation的执行情况,直到你可以使用这个应用程序为止


似乎正在进行某种权限检查,但半秒钟的时间似乎太长了。

管理员帐户在没有延迟的情况下工作,似乎没有任何权限可以做,但是这个帐户的启动速度恰好比普通域用户帐户快得多


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

您可以尝试打开文档几次,或者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;
WordApp:=CreateOleObject('Word.Application');
尽管如此
开始
尝试
Doc:=WordApp.documents.Open(sFile,EmptyParam,true);
打破
除了
关于E:EOleSysError do
开始
//如果不是预期的“命令失败”错误,则引发错误
如果E.ErrorCode-2146824090,则
提高;
结束;
结束;
结束;
编辑:


请查看哪个提供了更好的解决方案,并解释了为什么会发生这种情况。

我意识到此线程非常旧,但我通过确保在退出之前关闭文档(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;

我找不到问号。问题是什么?您会问普通用户延迟的原因是什么?是否安装了任何第三方加载项?我可以使用Delphi 2010和Vista 32上的Office 2010来确认此问题。我还从客户那里收到此错误的报告(0x800A1066)。总是Word 2010,总是文档。打开调用失败。它与本地管理员帐户一起使用的rason似乎是Word与此帐户启动速度的两倍。我不知道为什么doughThis对我来说工作得很好,在2007年的时候工作得很好,但在2010年的时候却不行。嗯,对于刚开始访问模板文件的用户来说,这些模板文件存在于网络共享上(办公室之外,因此连接速度非常慢)+1@JamesSkemp:您可能想在这里查看我的stackoverflow答案:好主意,so+1(用于评论和其他答案)。要获得更好的解决方法: