Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Word, CreateOleObject и PID / 25 сообщений из 50, страница 1 из 2
17.04.2019, 16:23
    #39802924
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Создаю экземляр сервера Word

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  function CreateWordServer: OleVariant;
  begin
    Result := CreateOleObject('Word.Application')
    Result.Options.CheckGrammarAsYouType := False;
    Result.Options.CheckSpellingAsYouType := False;
    Result.Visible := False;
    Result.DisplayAlerts := wdAlertsNone
  end;



После выполнения CreateWordServer система создает процесс WINWORD.EXE.
Существует ли более быстрый способ получить его Process ID?
Пока в голову приходит только "получить список процессов" - "запустить Word" - "получить новый список процессов" - "сравнить списки".


When a movie is over, it's a black
...
Рейтинг: 0 / 0
17.04.2019, 16:25
    #39802926
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
IRunningObjectTable ?
...
Рейтинг: 0 / 0
17.04.2019, 16:41
    #39802941
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
в голову приходит:
Window.Hwnd - по HWND явно можно получить PID

макросом:
сделать макрос в Word'е, в нем вызывать что нибудь типа GetCurrentProcess. Но макросы это криво по определению

возможно можно через IRunningObjectTable, но я с ним никогда не работал.
...
Рейтинг: 0 / 0
17.04.2019, 16:42
    #39802943
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Leonid Kudryavtsevв голову приходит:
Window.Hwnd - по HWND явно можно получить PID
О каком Window идет речь?
...
Рейтинг: 0 / 0
17.04.2019, 16:44
    #39802944
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
КвейдLeonid Kudryavtsevв голову приходит:
Window.Hwnd - по HWND явно можно получить PID
О каком Window идет речь?
любом внутри Word'а

будет ли создаваться какое нибудь Application.ActiveWindow если Application.Visible=false я не знаю, нужно проверять
...
Рейтинг: 0 / 0
17.04.2019, 16:46
    #39802945
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
...
Рейтинг: 0 / 0
17.04.2019, 16:50
    #39802951
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
_Application.Hinstance вернёт что нужно
...
Рейтинг: 0 / 0
17.04.2019, 16:52
    #39802954
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Michael Longneck_Application.Hinstance вернёт что нужноА это разве не Excel only фича?
...
Рейтинг: 0 / 0
17.04.2019, 16:54
    #39802958
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Я думаю у всех офисных приложений есть. А так, out-of-process серверы COM ничего тебе не скажут, такого API не просматривается общего.
...
Рейтинг: 0 / 0
17.04.2019, 16:54
    #39802960
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Leonid KudryavtsevКвейдпропущено...
О каком Window идет речь?
любом внутри Word'а

будет ли создаваться какое нибудь Application.ActiveWindow если Application.Visible=false я не знаю, нужно проверятьА если на машине запущено два экземпляра Word, один "мой", а другой пользовательский?
...
Рейтинг: 0 / 0
17.04.2019, 17:04
    #39802967
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
запущены и запущены, в чем проблема?
окна то у них разные будут

сам так не делал, потребности не было

тут скорее проблема, что OLE вроде не гарантирует. что в этом случае будет два экземпляра и два разных процесса. Т.ч. чисто формально, вполне может оказаться на 100500 документов один экемпляр процесса ))) который поделить на "мой" и "другой" физически не возможно

IMHO & AFAIK
...
Рейтинг: 0 / 0
17.04.2019, 17:39
    #39802994
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Квейд, а цель всего этого какова?
зачем?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.04.2019, 11:05
    #39803206
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
МимопроходящийКвейд, а цель всего этого какова?
зачем?
Приложение работает как служба. Задача очень простая, загрузить документ Word и сохранить его как текстовый файл.
Код тоже очень простой, как дверь.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
/////////////////////////////////

var
  WordServer: OleVariant;
  WordDocument: OleVariant;

/////////////////////////////////

  function SaveAsTextFile(const AFileDoc: string; var AFileText: string): Boolean;
  begin
    AFileText := ChangeFileExt(AFileDoc, '.TXT');
    Result := True;
    if not VarIsEmpty(WordServer) then
      try
        WordDocument := WordServer.Documents.Open(AFileDoc, False, True, False);
        try
          while WordDocument.Tables.Count > 0 do
            WordDocument.Tables.Item(1).ConvertToText;
          WordDocument.SaveAs2(FileName := AFileText, FileFormat := wdFormatText, LockComments := False,
            AddToRecentFiles := False, ReadOnlyRecommended := False, EmbedTrueTypeFonts := False,
            SaveNativePictureFormat := False, SaveFormsData := False, SaveAsAOCELetter := False, Encoding := 1251,
            InsertLineBreaks := False, AllowSubstitutions := False, LineEnding := wdCROnly, CompatibilityMode := 0);
        finally
          WordDocument.Close(False, False, False)
        end
      except
        Result := False
      end
  end;



Казалось бы, что тут крамольного? А прикол в том, что на НЕКОТОРЫХ (не на всех) машинах на НЕКОТОРЫХ (не на всех) документах, содержащих таблицы, выделенный код в режиме службы на выделенной строке:

1) Падает с Invalid variant operation, но это еще пол-беды
2) Этот же код в режиме приложения под отладчиком на всех машинах работает нормально
3) После падения с Invalid variant operation происходит самое плохое: память, занятая процессом WINWORD.EXE начинает бесконтрольно утекать со скоростью 20-50 метров в секунду, после того как WINWORD.EXE разрастается в памяти до 16 (!) гигов, другие приложения получают отлуп Оut of memory и через какое-то время зависает компьютер, после чего Винда самостоятельно уходит на перезагрузку. Я этого допустить не могу, так как служба крутиться в продакшене на той же виртуалке, что и сервер БД.



Пока я смотрю в сторону костыля - программно "тушить" процесс WINWORD.EXE в случае, если что-то пошло не так.
...
Рейтинг: 0 / 0
18.04.2019, 11:10
    #39803211
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Буду рад выслушать советы, ибо это жесть какая-то
...
Рейтинг: 0 / 0
18.04.2019, 11:16
    #39803219
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
я бы забил болт на Word вообще.
есть куча дельфийских библиотек,
которые умеют самостоятельно парсить документы MS Officce.
не прибегая к COM/OLE.


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.04.2019, 11:22
    #39803227
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Мимопроходящийя бы забил болт на Word вообще.
есть куча дельфийских библиотек,
которые умеют самостоятельно парсить документы MS Officce.
не прибегая к COM/OLE.


А есть гарантия, что что "куча дельфийских библиотек" поддерживают все стандарты Word в полном объеме, и не подложат мне свинью на каком-нибудь одном документе из тысячи?
...
Рейтинг: 0 / 0
18.04.2019, 11:25
    #39803229
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
18.04.2019 11:22, Квейд пишет:
> А есть гарантия, что что "куча дельфийских библиотек" поддерживают все стандарты Word в полном объеме, и не подложат мне свинью на каком-нибудь одном документе из тысячи?

полную гарантию даёт только страховой полис. (С)

то что делаешь сейчас - попытка подстелить соломки под пороховую бочку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.04.2019, 11:25
    #39803230
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Мимопроходящий,

если нетрудно, дай пару примеров библиотек, я посмотрю в эту сторону, конечно
...
Рейтинг: 0 / 0
18.04.2019, 11:38
    #39803237
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
18.04.2019 11:25, Квейд пишет:
> если нетрудно, дай пару примеров библиотек, я посмотрю в эту сторону, конечно

я лично юзаю Axolot Data.
правда в основном для XLS и XLSX.
но и для DOCX у них тоже есть.
http://www.axolot.com/products.htm

пробовал EMS Quick Import, но чо-то не зашло.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.04.2019, 15:48
    #39803453
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Квейд2) Этот же код в режиме приложения под отладчиком на всех машинах работает нормальноА под отладчиком в режиме службы?

Дальше, для отладки я бы этот код переписал так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
  Tables: OleVariant;
  Count: Integer;
begin
  ...........
  Tables = WordDocument.Tables;
  Count = Tables.Count;
  while Count > 0 do begin
    Tables.Item(1).ConvertToText;
    Count = Tables.Count;  // Еще лучше Dec(Count)
  end;
end;

и посмотрел бы где будет падать.

и еще, ты уверен, что в выделенном должно быть 1, а не 0?
...
Рейтинг: 0 / 0
18.04.2019, 15:52
    #39803459
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
_Vasilisk_Квейд2) Этот же код в режиме приложения под отладчиком на всех машинах работает нормальноА под отладчиком в режиме службы?

А как отлаживать запущенную службу? В окне Attach to process моей службы нету в списке. Галочки щелкал.

_Vasilisk_Дальше, для отладки я бы этот код переписал так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
  Tables: OleVariant;
  Count: Integer;
begin
  ...........
  Tables = WordDocument.Tables;
  Count = Tables.Count;
  while Count > 0 do begin
    Tables.Item(1).ConvertToText;
    Count = Tables.Count;  // Еще лучше Dec(Count)
  end;
end;

и посмотрел бы где будет падать. Попробую


_Vasilisk_и еще, ты уверен, что в выделенном должно быть 1, а не 0?

В талмуде с единички начинают https://docs.microsoft.com/ru-ru/office/vba/api/word.table
...
Рейтинг: 0 / 0
18.04.2019, 15:55
    #39803466
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Если закомментировать

Код: pascal
1.
2.
          while WordDocument.Tables.Count > 0 do
            WordDocument.Tables.Item(1).ConvertToText;



то служба падает дальше на

Код: pascal
1.
2.
3.
4.
          WordDocument.SaveAs2(FileName := AFileText, FileFormat := wdFormatText, LockComments := False,
            AddToRecentFiles := False, ReadOnlyRecommended := False, EmbedTrueTypeFonts := False,
            SaveNativePictureFormat := False, SaveFormsData := False, SaveAsAOCELetter := False, Encoding := 1251,
            InsertLineBreaks := False, AllowSubstitutions := False, LineEnding := wdCROnly, CompatibilityMode := 0);



т.е. проблема не в ConvertToText, а в самом обращении к серверу Word
...
Рейтинг: 0 / 0
18.04.2019, 15:56
    #39803468
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Квейдт.е. проблема не в ConvertToText, а в самом обращении к серверу Wordт.е. к WordDocument
...
Рейтинг: 0 / 0
18.04.2019, 16:44
    #39803504
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
А нельзя интерфейсы прямо получить, а не через OleVariant обрабатывать? _WordApplication и.т.д.? Может так понятнее будет где ошибка?
...
Рейтинг: 0 / 0
18.04.2019, 17:15
    #39803519
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word, CreateOleObject и PID
Michael Longneck,

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


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