Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.09.2021, 12:42
FrankBY FrankBY вне форума
Прохожий
 
Регистрация: 14.09.2021
Сообщения: 3
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Как отловить событие закрытия файла

Помогите, кто может, со следующим:

Я программно запускаю файл на редактирование командой ShellExecuteEx (@Info). Это может быть любой документ (XLSX, DOCX, PDF, DWG).

Как мне узнать что внешняя программа, работающая с выбранным файлом, закончила работу?

У меня есть код, который улавливает завершение работы приложение (например EXCEL.EXE, WINWORD.EXE), но события не происходит если закрыть один из нескольких открытых файлов Excel...

Нужен рабочий пример.
Ответить с цитированием
  #2  
Старый 15.09.2021, 05:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,993
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Запускай через CreateProcess. Там возвращается хэндл процесса. Вот и отслеживай наличие этого процесса. Примеров полно везде.
Ответить с цитированием
  #3  
Старый 15.09.2021, 11:27
FrankBY FrankBY вне форума
Прохожий
 
Регистрация: 14.09.2021
Сообщения: 3
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Нужен пример

Так-то оно так... Но процесс EXCEL один, даже если открыто несколько документов. В диспетчере задач при открытии документа появляется новый процесс EXCEL.EXE и тут же исчезает, оставляя один процесс.
Ответить с цитированием
  #4  
Старый 15.09.2021, 11:30
FrankBY FrankBY вне форума
Прохожий
 
Регистрация: 14.09.2021
Сообщения: 3
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Нужен пример

Цитата:
Сообщение от lmikle
Примеров полно везде.
Все примеры, найденные мной, ведут себя именно так: CreateProcess заканчивает свою работу только при закрытии приложения, а не одного документа.
Ответить с цитированием
  #5  
Старый 15.09.2021, 18:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,993
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да, тут вообще сложно.
Что можно сделать:
0. Посмотреть, можно ли принудительно открывать документ в новом процессе (надо смотреть какие флаги можно передать приложению, что бы оно не "перебрасывало" открываемый документ в существующий процесс)
1. Отслеживать изменение самого файла на диске. Правда тут не понятно, закончил ли пользователь работу с файлом или просто сохранил его.
2. Переделать код на использование OLE. Этот вариант в большинстве случаев только для измненений из программы.
3. Вставить Word/Excel через OLE Container в свою программу - т.е. не открывать документ в отдельном приложении, а делать это внутри своей программы, например, в диалоговом окне - как пользователь зарыл это оконо, значит работа с документом закончена. Видимо, это самый подходящий вариант.

ЗЫ. Это просто прикидки что можно сделать, т.к. не понятно какова цель открытия документа и отслеживания его закрытия.
Ответить с цитированием
  #6  
Старый 22.09.2021, 02:10
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Скорее всего надо пойти другим путем. Надо отслеживать существование служебного файла, который создается для всех открытых на редактирование документов Word. Возможно вы видели такой файл, он создается рядом с открытым документом и для файла FileName.doc, будет иметь вид ~$leName.doc Этот файл автоматически удаляется, когда документ закрывается - вот вам и средство контроля. Для экселя должно быть так же.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 22.09.2021 в 02:23.
Ответить с цитированием
  #7  
Старый 27.09.2021, 07:55
AlexeiMylnikov AlexeiMylnikov вне форума
Прохожий
 
Регистрация: 23.08.2021
Сообщения: 2
Версия Delphi: Delphi 10.4.2
Репутация: 10
По умолчанию

Попробуй дождаться освобождения файла, вот кусок из моей программы, подредактируй под себя:

Код:
if(FileExists(FileName))then begin
                         try    i:=0; //Жду  освобождения  файла, но не более 20 сек:
                                repeat i:=i+1;
                                       HFileRes := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,  0);
                                       b := (HFileRes = INVALID_HANDLE_VALUE); // False => файл не занят никем
                                       if(b)then                                          // Занят, жду-освобождения
                                            ELSE begin CloseHandle(HFileRes); BREAK; end; // Не занят, выхожу из ожидания
                                       Label1.Caption:='Жду освобождения файла: '+IntToStr(i)+c13+ExtractFileName(FileName); Application.ProcessMessages; Sleep(200);   
                                until (i>99);
                                if(i>1)then Label1.Caption:='Освободился'+c13+ExtractFileName(FileName); if(i>99)then Label1.Caption:='Занят'+c13+ExtractFileName(FileName); if(i>1)then Application.ProcessMessages;
                         except end;
Админ: Пользуемся тегами при оформлении кода!

Последний раз редактировалось Admin, 27.09.2021 в 19:29.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter