![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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.  |