Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли как-то поубивать запущенные процессы Ворда и Экселя?


TStas ©   (2006-08-01 19:58:00) 

Написал программу, которая готовит некоторые документы в Ворде и Экселе. Но если происходит ошибка, то документ остается открытым. Как бы получить доступ к списку процессов запущенных и позакрывать ворды и эксели? (Как я сейчас вручную делаю Ctrl+Alt+Del)


ISK(CMEPTb)   (2006-08-04 22:57:00) [1]


> TStas ©   (01.08.06 19:58)  
> Написал программу, которая готовит некоторые документы в
> Ворде и Экселе. Но если происходит ошибка, то документ остается
> открытым. Как бы получить доступ к списку процессов запущенных
> и позакрывать ворды и эксели? (Как я сейчас вручную делаю
> Ctrl+Alt+Del)


А тебе обязательно их убивать?
И вообще зачем тебе сам Ворд - делай через OLE:

var
 oWord: OleVariant;
 oDoc: OleVariant;

...

 try
   oWord := GetActiveOleObject('Word.Application'); {если запущен Word - юзаем его сервер}
 except
   oWord := CreateOleObject('Word.Application'); {если нет - создаём новый}
 end;
 oWord.Documents.Open(FileName); {ну ясно - открываем}
 oDoc  := oWord.ActiveDocument;

{и делай с ним что хошь...
В конце не забудь закрыть:}

oDoc.SaveAs(FileName); {сохраняем созданный документ}
 oWord.ActiveDocument.Close(wdDoNotSaveChanges, EmptyParam, EmptyParam);  {закрываем Вордовский сервер}
 oWord.Quit(EmptyParam, EmptyParam, EmptyParam);
 oDoc := VarNull; {обязательно обнуляй переменные для след. открытия}
 oWord := VarNull;


> umbra ©   (04.08.06 16:10)
> а вот интересно, есть ли способ методами OLE/Com получить
> список активных серверов одной разновидности (например,
> открытых экселей)?


В данном случае сервер запускается один и он активен в течении всего сеанса. Просто instance (копий) приложения, напр. того же Excel может быть несколько. Соответственно каждая копия идёт как отдельный процесс. А как юзер узнает, какой из них нужно убить (если их 2 или больше)? Так что это неверный путь.


umbra   (2006-08-04 16:10:00) [2]

а вот интересно, есть ли способ методами OLE/Com получить список активных серверов одной разновидности (например, открытых экселей)?


Alekcvp   (2006-08-04 10:09:00) [3]


> TStas ©   (02.08.06 19:41) [5]
> У меня Дельфи ругаются - какой-то модуль я в юзез не указал,
> а каккой- не знаю :(

Сорри, забыл: tlhelp32.


Slym   (2006-08-04 05:22:00) [4]

TASKKILL /F /IM EXCEL.EXE /IM WINWORD.EXE /T


Anatoly Podgoretsky   (2006-08-03 22:56:00) [5]

У меня обычно два или более, при построении отчетов я открываю отдельный Эксель и у пользователя открыт один или два экземпляра.


YurikGL   (2006-08-03 22:07:00) [6]


> но может оказаться, что созданный ею документ открыт для
> просмотра, а ее запустили. Что из всего этого выйдет, думаю,
>  объяснять не надо

Подключаешься через GetActiveOleObject, проходишься по списку загруженных документов...
И надеешься, что у пользователя не загружено два Екселя.


TStas   (2006-08-03 21:35:00) [7]

>YurikGL Так ведь try...except не помогает - ошибки ведь не происходит, просто эксель не сохраняет изменения в однажды открытом файле.


YurikGL   (2006-08-02 20:48:00) [8]


> >Ketmar Вообще-то да. А вот как это проверить?

try - except ?


Ketmar   (2006-08-02 20:41:00) [9]

> [7] TStas ©   (02.08.06 20:33)

а не знаю. это надо думать и экспериментировать. у меня такой задачи нет. попробуй задать отдельным вопросом, может, кто уже делал. %-)


TStas   (2006-08-02 20:33:00) [10]

>Ketmar Вообще-то да. А вот как это проверить?


Ketmar   (2006-08-02 20:18:00) [11]

> [5] TStas ©   (02.08.06 19:41)

вот то, что она это не проверяет уже и есть ошибка.


TStas   (2006-08-02 19:41:00) [12]

>Alekcvp
У меня Дельфи ругаются - какой-то модуль я в юзез не указал, а каккой- не знаю :(
>Ketmar Так нет в программе ошибок. Она готовит документы, но может оказаться, что созданный ею документ открыт для просмотра, а ее запустили. Что из всего этого выйдет, думаю, объяснять не надо


YurikGL   (2006-08-01 21:54:00) [13]


> TStas ©   (01.08.06 19:58)  

Всегда делай XLApp := Unassigned;, как указанно в umbra ©   (01.08.06 20:19) [2] .

Если начнешь убивать все процессы, то они начнуть спрашивать "а не сохранить ли файл" да еще и не дай бог закроешь документ, который пользователь до этого набивал пару часов.


Alekcvp   (2006-08-01 20:35:00) [14]

Процедура убивает все процессы по имени экзешника. Лишний код вырезал прямо тут, так что могут быть небольшие ляпы...


// Убивает указанный процесс в системе
procedure KillProcess(Param: String);
var
 Snapshot: THandle;
 Process: TProcessEntry32;
 hProcess: THandle;
 Result: Boolean;
begin
 // Создаем снимок системы
 Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 If Snapshot <> INVALID_HANDLE_VALUE then begin
   // Если не указано расширение процесса, то принимаем '.exe'
   If Pos('.', Param) = 0 then Param := Param + '.exe';
   Process.dwSize := SizeOf(Process);
   // Начинаем перебор процессов
   Result := Process32First(Snapshot, Process);
   While Result do With Process do begin
     // Проверка на искомый процесс
     If StrEq(Param, Process.szExeFile) then begin
       // Получаем хэндл процесса по идентификатору
       hProcess := OpenProcess(PROCESS_TERMINATE, False, Process.th32ProcessID);
       If hProcess <> INVALID_HANDLE_VALUE then
         // Уничтожаем процесс
         TerminateProcess(hProcess, DWord(-1));
       // Закрываем ненужный хэндл процесса
       CloseHandle(hProcess);
     end;
     // Получаем следующий процесс
     Result := Process32Next(Snapshot, Process);
   end;
   // Уничтожаем снимок системы
   CloseHandle(Snapshot);
 end;
end;


umbra   (2006-08-01 20:19:00) [15]

грубо говоря, надо делать что-то вроде
try
{что-то делаем с таблицей}
finally
   XLApp.DisplayAlerts := false;
   XLApp.Quit;
   XLApp := Unassigned;
end;


Ketmar   (2006-08-01 20:16:00) [16]

а может, просто отлавливать в своей программе ошибки и делать всё корректно, без изнасилований?


Наверх

Титульная страница Поиск, карта сайта Написать письмо