Консультация № 53113
24.08.2006, 13:09
0.00 руб.
0 5 2
Сложилась такая ситуация, вообщем есть программа которую необходимо закрывать и запусакть каждые 30 минут. Я уже написал отсчет времени и запуск программы через определенный интерввал времени. Осталось только закрыть программу. Но посколько программа все время находится в трее то через FindWindow не получиться сделать.
Я знаю имя этой программы и имя процесса (IpmSrv.exe), так вот как мне выключать эту программу снятием процесса,

Пожалуйста помогите, срочно нужно.

Обсуждение

давно
Мастер-Эксперт
425
4118
24.08.2006, 13:34
общий
это ответ
Здравствуйте, Пономарев Евгений Виктороич!
Процесс можно закрыть либо с помощью универсальной функции CloseHandle(), либо с помощью функции TerminateProcess(). Параметром и там и там служит хэндл процесса. Кроме того второй функции нужно задать код выхода, который сообщает ОС причину выхода. Вторая функция предпочтительнее, т.к. она завершает все связанные с процессом потоки, если у Вас программа многопоточная.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
24.08.2006, 13:43
общий
Понял что можно воспользоваться функцией TerminateProcess() Тогда вопрос как мне получиьб хендл этого процесса, и какой ключ нужен для того чтобы программа закрылась без лишних вопросов.
Неизвестный
24.08.2006, 14:07
общий
это ответ
Здравствуйте, Пономарев Евгений Виктороич!
Функция для закрытия - в приложении. Так можно убить прогу, которая не запрещает открытие своего процесса с флагом PROCESS_TERMINATE. Допишите в uses модуль tlhelp32!
function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;

FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);

while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(
PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;

CloseHandle(FSnapshotHandle);
end;
Неизвестный
24.08.2006, 14:16
общий
Попробовал я функцию KillTask, но чото она не работает, В качетсве передоваемого параметра передавал как имя процесса в диспетчере задач, так и имя запускаемого файла. Но не в одном из случаев программа так и не закрылась.Может это из-за того что программа запускается как системный процесс.
Неизвестный
25.08.2006, 03:02
общий
ShellExecute(nil, nil, PChar(‘taskkill‘), PChar(‘/im "ipmsvr.exe" /f‘), nil, SW_HIDE);Работает в WinXP, Win2K3НЕ работает в Win2K и младше.Собственно, не работает потому, что нет такой консольной команды taskkillОпция /f обязательно - потому, что почти никто не хочет умирать просто так =)
Форма ответа