|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как отловить событие закрытия файла
Помогите, кто может, со следующим:
Я программно запускаю файл на редактирование командой ShellExecuteEx (@Info). Это может быть любой документ (XLSX, DOCX, PDF, DWG). Как мне узнать что внешняя программа, работающая с выбранным файлом, закончила работу? У меня есть код, который улавливает завершение работы приложение (например EXCEL.EXE, WINWORD.EXE), но события не происходит если закрыть один из нескольких открытых файлов Excel... Нужен рабочий пример. |
#2
|
|||
|
|||
Запускай через CreateProcess. Там возвращается хэндл процесса. Вот и отслеживай наличие этого процесса. Примеров полно везде.
|
#3
|
|||
|
|||
Нужен пример
Так-то оно так... Но процесс EXCEL один, даже если открыто несколько документов. В диспетчере задач при открытии документа появляется новый процесс EXCEL.EXE и тут же исчезает, оставляя один процесс.
|
#4
|
|||
|
|||
Нужен пример
Цитата:
|
#5
|
|||
|
|||
Да, тут вообще сложно.
Что можно сделать: 0. Посмотреть, можно ли принудительно открывать документ в новом процессе (надо смотреть какие флаги можно передать приложению, что бы оно не "перебрасывало" открываемый документ в существующий процесс) 1. Отслеживать изменение самого файла на диске. Правда тут не понятно, закончил ли пользователь работу с файлом или просто сохранил его. 2. Переделать код на использование OLE. Этот вариант в большинстве случаев только для измненений из программы. 3. Вставить Word/Excel через OLE Container в свою программу - т.е. не открывать документ в отдельном приложении, а делать это внутри своей программы, например, в диалоговом окне - как пользователь зарыл это оконо, значит работа с документом закончена. Видимо, это самый подходящий вариант. ЗЫ. Это просто прикидки что можно сделать, т.к. не понятно какова цель открытия документа и отслеживания его закрытия. |
#6
|
||||
|
||||
Скорее всего надо пойти другим путем. Надо отслеживать существование служебного файла, который создается для всех открытых на редактирование документов Word. Возможно вы видели такой файл, он создается рядом с открытым документом и для файла FileName.doc, будет иметь вид ~$leName.doc Этот файл автоматически удаляется, когда документ закрывается - вот вам и средство контроля. Для экселя должно быть так же.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 22.09.2021 в 02:23. |
#7
|
|||
|
|||
Попробуй дождаться освобождения файла, вот кусок из моей программы, подредактируй под себя:
Код:
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. |