2010-10-26 2 views
5

У нас есть программа, созданная в Borland Delphi, которая использует автоматизацию Word для создания документов. . При установке (сервере терминалов) мы можем использовать автоматизацию Word только при работе в качестве локального администратора.
При запуске как пользователь анотера появляется сообщение об ошибке «Opdracht mislukt -2146824090» (его голландская версия Office), которая, как я полагаю, переведена на «Operation failed» или «Command failed».Автоматизация Word работает только для администратора или с задержкой после создания word.application

У пользователя есть доступ на чтение и запись в папку, где программа пытается поместить новый документ.

Офис 2010
64бит Windows Server 2008 R2 стандарт

Приложеиние является применение 32bit окна.

Если я добавлю задержку (500 мс) после создания слова., Все работает как нормальный.

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

Кто-нибудь знает, почему команда CreateOleObject теперь возвращается до того, как приложение Word может быть использовано?

+0

Я не нахожу знак вопроса. В чем вопрос? – Vantomex

+0

Вы спрашиваете, что может послужить причиной этой задержки для обычных пользователей? –

+0

Установлены ли надстройки сторонних разработчиков? –

ответ

0

Учетная запись администратора, работающая с задержкой, похоже, не имеет никаких прав на выполнение, но для этого аккаунта это происходит быстрее, чем обычные учетные записи пользователей домена.

Я могу жить с обходным путем, но если кто-нибудь знает лучший способ, дайте мне знать.

+1

Для лучшего обходного пути: http: // stackoverflow.com/questions/5913665/word-2010-automation-goto-bookmark/5922158 # 5922158 –

1

Если вы хотите отследить это, вы можете использовать такой инструмент, как ProcessMonitor, чтобы отслеживать выполнение автоматизации Word до момента, в котором вы можете использовать приложение.

Кажется, что происходит проверка прав - но полсекунды слишком много времени для этого.

+0

Сцена, с которой он работает с учетной записью локального администратора, похоже, заключается в том, что Word запускается в два раза быстрее с этой учетной записью. Не знаю, почему тесто – Mike

1

Вы можете попытаться открыть документ несколько раз, или это слово полностью увязано после того, как оно дало ошибку?

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; 

Edit:

Пожалуйста, см my answer here, который обеспечивает лучшее решение и объяснение, почему это происходит.

+0

Это отлично сработало для меня в инструменте, который отлично работал с 2007 годом, но не против 2010 года. Ну, ожидайте от пользователя, который обращается к файлам шаблонов , при запуске, которые существуют на сетевом ресурсе (вне офиса, поэтому соединение происходит очень медленно). +1 –

+1

@James Skemp: вы можете проверить мой ответ stackoverflow здесь: http://stackoverflow.com/questions/5913665/word-2010-automation-goto-bookmark/5922158#5922158 –

+0

Отличная идея, поэтому +1 (для комментариев и вашего другого ответа). –

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;