Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

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

 
TStas ©   (2006-08-01 19:58) [0]

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


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

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


 
umbra ©   (2006-08-01 20:19) [2]

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


 
Alekcvp ©   (2006-08-01 20:35) [3]

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


// Убивает указанный процесс в системе
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;


 
YurikGL ©   (2006-08-01 21:54) [4]


> TStas ©   (01.08.06 19:58)  

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

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


 
TStas ©   (2006-08-02 19:41) [5]

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


 
Ketmar ©   (2006-08-02 20:18) [6]

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

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


 
TStas ©   (2006-08-02 20:33) [7]

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


 
Ketmar ©   (2006-08-02 20:41) [8]

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

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


 
YurikGL ©   (2006-08-02 20:48) [9]


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

try - except ?


 
TStas ©   (2006-08-03 21:35) [10]

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


 
YurikGL ©   (2006-08-03 22:07) [11]


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

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


 
Anatoly Podgoretsky ©   (2006-08-03 22:56) [12]

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


 
Slym ©   (2006-08-04 05:22) [13]

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


 
Alekcvp ©   (2006-08-04 10:09) [14]


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

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


 
umbra ©   (2006-08-04 16:10) [15]

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


 
ISK(CMEPTb) ©   (2006-08-04 22:57) [16]


> 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 или больше)? Так что это неверный путь.



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.05 c
15-1155287614
vajo
2006-08-11 13:13
2006.09.17
Штрафы за использование пиратского ПО


2-1156745169
Raesta
2006-08-28 10:06
2006.09.17
Окошко ввода


1-1154671478
Alekcvp
2006-08-04 10:04
2006.09.17
"Мои Документы" и TSaveDialog


2-1156851094
Percent
2006-08-29 15:31
2006.09.17
DataModule и иже с ним...


3-1152879236
Дмитрий Д.
2006-07-14 16:13
2006.09.17
MySQL. Вложенные запросы