powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Word, CreateOleObject и PID
25 сообщений из 50, страница 2 из 2
Word, CreateOleObject и PID
    #39803573
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как идеи:
1)
Гугля уверяет. что ошибка случается, когда в Variant содержится null.

Вы не пытались, после Open проверять, действительно ли документ открыт и WordDocument корректен.

Насколько я вижу по Вашим словам "Если закомментировать...то служба падает дальше на ...
т.е. проблема не в ConvertToText, а в самом обращении к серверу Word" обращении к WordDocument

2)
Некоторые операции Word умеет выполнять ассинхронно (например пагинацию). Вполне возможно, что ConvertToText из их числа. Я бы while заменил на for в обратном порядке (т.е. сначала обрабатывать последнию таблицу в документе по индексу и двигаться к первой).

Т.е. идея аналогичная предложению 21866312 только дополнительно изменить порядок обработки таблиц на обратный.

P.S. Беглый поиск по Inet уверяет. Documents.Open вполне может возврашать null в некоторых случаях (ошибки с правами). Возможно и при других ошибках при открытии документов вполне можно null словить.
https://social.msdn.microsoft.com/Forums/en-US/0f5448a7-72ed-4f16-8b87-922b71892e07/word-2007-documentsopen-returns-null-in-aspnet
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803788
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevКак идеи:
1)
Гугля уверяет. что ошибка случается, когда в Variant содержится null.

Вы не пытались, после Open проверять, действительно ли документ открыт и WordDocument корректен.

Насколько я вижу по Вашим словам "Если закомментировать...то служба падает дальше на ...
т.е. проблема не в ConvertToText, а в самом обращении к серверу Word" обращении к WordDocument

2)
Некоторые операции Word умеет выполнять ассинхронно (например пагинацию). Вполне возможно, что ConvertToText из их числа. Я бы while заменил на for в обратном порядке (т.е. сначала обрабатывать последнию таблицу в документе по индексу и двигаться к первой).

Т.е. идея аналогичная предложению 21866312 только дополнительно изменить порядок обработки таблиц на обратный.

P.S. Беглый поиск по Inet уверяет. Documents.Open вполне может возврашать null в некоторых случаях (ошибки с правами). Возможно и при других ошибках при открытии документов вполне можно null словить.
https://social.msdn.microsoft.com/Forums/en-US/0f5448a7-72ed-4f16-8b87-922b71892e07/word-2007-documentsopen-returns-null-in-aspnet В общем, синопис такой

Код: pascal
1.
2.
3.
4.
5.
6.
7.
        WordDocument := WordServer.Documents.Open(FileName := AFileDoc,
          ConfirmConversions := False,
          ReadOnly := True,
          AddToRecentFiles := False,
          Visible := False,
          OpenAndRepair := False,
          NoEncodingDialog := True);



Сразу после этого кода VarIsEmpty(WordDocument) = True, а процесс WINWORD.EXE ведет себя как я уже показывал ранее

...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803815
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

А накатить обновления на офис не поможет?.. Или и так всё стоит?
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803823
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpКвейд,

А накатить обновления на офис не поможет?.. Или и так всё стоит?

На моей машине (на которой код падает) - Office 2013
На машине коллеги (где код не падает) - Office 2016

Проблема в том, что заказчиков много и у каждого зоопарк офисов
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803825
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдalekcvpКвейд,

А накатить обновления на офис не поможет?.. Или и так всё стоит?

На моей машине (на которой код падает) - Office 2013
На машине коллеги (где код не падает) - Office 2016

Проблема в том, что заказчиков много и у каждого зоопарк офисов

Тем более очень похоже на баг офиса.
А если по условию "VarIsEmpty(WordDocument) = True" попытаться закрыть Word через OLE?...
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803827
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант: если это действительно баг и если для 2013 офиса есть патч этого бага, то можно найти это обновление отдельно и ставить его вместе с приложением принудительно, если у клиента стоит 2013 офис.
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803828
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpКвейдпропущено...


На моей машине (на которой код падает) - Office 2013
На машине коллеги (где код не падает) - Office 2016

Проблема в том, что заказчиков много и у каждого зоопарк офисов

Тем более очень похоже на баг офиса.
А если по условию "VarIsEmpty(WordDocument) = True" попытаться закрыть Word через OLE?...


Код: pascal
1.
  WordServer.Quit;



отрабатывает, я проверил.

Но процесс WINWORD.EXE продолжает жрать память до отказа
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803829
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и самое плохое, что эта замануха происходит только в режиме службы
этот же код на моей машине в режиме приложения отрабатывает нормально


у коллеги с другой версией офиса в режиме службы работает ОК
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803830
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

А служба от чьего имени запускается?
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803832
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то ещё читал, что чтобы заверщить процесс необходимо кроме вызова .Quit ещё обнулить все ссылки на сервер.
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803837
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpКвейд,

А служба от чьего имени запускается?Local system account

Но разве это имеет значение? У меня код падает на определенном наборе файлов, на другом наборе все отлично в службе.
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803839
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpГде-то ещё читал, что чтобы заверщить процесс необходимо кроме вызова .Quit ещё обнулить все ссылки на сервер.

у меня так

Код: pascal
1.
2.
3.
4.
5.
      if not VarIsEmpty(WordServer) then
      begin
        WordServer.Quit;
        WordServer := Unassigned
      end;
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803854
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдalekcvpКвейд,

А служба от чьего имени запускается?Local system account
Но разве это имеет значение? У меня код падает на определенном наборе файлов, на другом наборе все отлично в службе.

Ну, выше уже было предположение про права доступа, хотя у system полный доступ ко всему, так что мимо (если файлы не в сети лежат).
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803862
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
19.04.2019 11:25, Квейд пишет:
> у меня так
> if not VarIsEmpty(WordServer)then

проверять надо на not VarIsClear(WordServer)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803946
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд? В окне Attach to process моей службы нету в спискеIDE запустить от админа
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803947
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckА нельзя интерфейсы прямо получить, а не через OleVariant обрабатывать? _WordApplication и.т.д.?Там же совместимости нет. Они свои для каждой версии офиса
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803949
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейди самое плохое, что эта замануха происходит только в режиме службы
этот же код на моей машине в режиме приложения отрабатывает нормальноА попробуй у себя службу запустить от имени локального пользователя. Может разные Ворды стартуют?
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39803951
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39804048
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Кажется, вот твое счастье
https://stackoverflow.com/questions/10837437/interop-word-documents-open-is-null
http://davidsdotnetlines.blogspot.com/2015/12/wordapplicationdocumentsopen-returns.html

У меня в DCOM config отсутствует эквивалент параметра "Microsoft Word 97 - 2003 Document", но я сейчас еще поэксперементирую
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39804064
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд_Vasilisk_Кажется, вот твое счастье
https://stackoverflow.com/questions/10837437/interop-word-documents-open-is-null
http://davidsdotnetlines.blogspot.com/2015/12/wordapplicationdocumentsopen-returns.html

У меня в DCOM config отсутствует эквивалент параметра "Microsoft Word 97 - 2003 Document", но я сейчас еще поэксперементирую

Помогло!

Пошел с твоей ссылки дальше по ссылке

https://stackoverflow.com/questions/1006923/automating-office-via-windows-service-on-server-2008

всего-то нужно, чтобы на машине существовали папки

C:\Windows\System32\config\systemprofile\Desktop
C:\Windows\SysWOW64\config\systemprofile\Desktop

интересно, с чем это связано?
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39804068
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не решение напрямую, но как обходной вариант - т.к. цель всего лишь сохранить как текст, и если формат docx, то можно заюзать wordpad.

Как еще один обходной вариант - получать PID по hwnd и перед убитием проверять, от кого запущен и нет ли в нем лишних открытых документов
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39804080
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдПошел с твоей ссылки дальше по ссылкеНужно читать не только первый ответ с максимум голосов
https://stackoverflow.com/a/24671664/5376639
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39804093
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдC:\Windows\System32\config\systemprofile\Desktop
C:\Windows\SysWOW64\config\systemprofile\Desktop

интересно, с чем это связано?

Подозреваю что с "гениальностью" программистов офиса, которые по-умолчанию считают что офис запускает интерактивный пользователь и сохраняют туда какие-нибудь временные файлы (а-ля ~document1.docx).
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39804102
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдНо процесс WINWORD.EXE продолжает жрать память до отказа
Почему Эксель завершается только после CoUninitialize?
...
Рейтинг: 0 / 0
Word, CreateOleObject и PID
    #39804167
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Не надо никакого хендла

Простой макрос и вуаля
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Integer
Sub GetCurrentPID()

  i = GetCurrentProcessId()
  MsgBox "GetCurrentProcessId: " + CStr(i)
  Debug.Print i
    
End Sub
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Word, CreateOleObject и PID
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]