Форум: "Основная";
Текущий архив: 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