A automação de palavras funciona apenas para administrador ou com um atraso após a criação do Word.Application

StackOverflow https://stackoverflow.com/questions/4022719

Pergunta

Temos um programa feito em Borland Delphi que usa a automação de palavras para criar documentos. Em uma instalação (Terminal Server), só podemos fazer com que a automação do Word funcione ao executar como administrador local.
Quando Runnnig como usuário do Anoter recebemos uma mensagem de erro "Opdracht mislukt -2146824090" (sua versão holandesa do Office), que acho que é traduzido para "Operação falhou" ou "comando falhou".

O usuário leu/grava acesso à pasta em que o programa tenta colocar o novo documento.

Office 2010
64bits Windows Server 2008 R2 padrão

A aplicação é um aplicativo Windows de 32 bits.

Se eu adicionar um atraso (500ms) após a aplicação do Word.Aplicação, tudo funciona como normalmente.

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

Alguém sabe por que o comando CreateOleObject agora retorna antes que o aplicativo Word possa ser usado?

Foi útil?

Solução 3

A conta do administrador que trabalha com atraso parece não ter nada com os direitos a fazer, mas essa palavra começa muito mais rápido com essa conta do que as contas de usuário de domínio normal.

Eu posso viver com o atraso na solução alternativa, mas se alguém souber de uma maneira melhor, por favor me avise.

Outras dicas

Se você quiser acompanhar isso, você pode usar uma ferramenta como Processmonitor Para rastrear as execuções de automação de palavras até o ponto que você pode usar o aplicativo.

Parece que está ocorrendo algum tipo de verificação de direitos - mas meio segundo parece muito tempo apenas para isso.

Você pode tentar abrir o documento algumas vezes, ou a palavra está totalmente presa depois de ter dado o erro?

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;

Editar:

Por favor, veja minha resposta aqui que fornece uma solução melhor e uma explicação por que isso acontece.

Sei que esse tópico é bastante antigo, mas resolvi esse problema certificando -me de fechar o documento antes de desistir (OLEDOCUMENT.CLOSE). Ao fazer isso, não há necessidade de qualquer tipo de atraso, etc. Veja o trecho de código Delphi abaixo.

Exemplo:

  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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top