Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.038 c
15-1156231179
Шмелъ
2006-08-22 11:19
2006.09.17
Сайт


2-1156398170
__DATA__
2006-08-24 09:42
2006.09.17
Как изменить размер памяти, на которую указывает указатель?


15-1156396740
konrads
2006-08-24 09:19
2006.09.17
Ридеры магнитных карт


15-1156258798
Andy BitOff
2006-08-22 18:59
2006.09.17
Атомами научились управлять поштучно


3-1153217509
SergeD
2006-07-18 14:11
2006.09.17
Еще один вопрос по работе с FastReport





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский