Как-то жизнь заставила меня написать программу отображающую технологические процессы предприятия. То есть сидит диспетчер и на экране видит все что творится на объектах предприятия.
Ставить iFix я не стал по многим причинам, таким как цена, громоздкость, проблемы со связью.
В процессе написания было много острых углов, для связи использовал сторонние компоненты, которые валились с access violation и т.п.
Плюс при подключение\переподключение интерфейс вис намертво, поэтому были применены потоки. Одна радость хоть винда в синьку не уходила)
Но время не ждало пришлось ставить сырые билды, ждать баг-репортов и логировать все что возможно.
При падение процесс оставался висеть в памяти. Однозначно требовался механизм недопущения запуска нескольких копий.
Америку я не открою, остановился я на таком методе:
Ищем дескрипторы всех процессов и проверяем нет ли процесса с нашим именем, если есть то завершаем.
Код будет располагаться в dpr файле проекта, в 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))
and (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName)))
and (FProcessEntry32.th32ProcessID <> GetCurrentProcessId())
then
Result := Integer(TerminateProcess(OpenProcess( PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
Пример использования:
Killtask ('имя жертвы');
Важное замечание
Имя жертвы - это имя запускаемого файла+расширение. Например winlogon.exe.
Ставить iFix я не стал по многим причинам, таким как цена, громоздкость, проблемы со связью.
В процессе написания было много острых углов, для связи использовал сторонние компоненты, которые валились с access violation и т.п.
Плюс при подключение\переподключение интерфейс вис намертво, поэтому были применены потоки. Одна радость хоть винда в синьку не уходила)
Но время не ждало пришлось ставить сырые билды, ждать баг-репортов и логировать все что возможно.
При падение процесс оставался висеть в памяти. Однозначно требовался механизм недопущения запуска нескольких копий.
Америку я не открою, остановился я на таком методе:
Ищем дескрипторы всех процессов и проверяем нет ли процесса с нашим именем, если есть то завершаем.
Код будет располагаться в dpr файле проекта, в 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))
and (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName)))
and (FProcessEntry32.th32ProcessID <> GetCurrentProcessId())
then
Result := Integer(TerminateProcess(OpenProcess( PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
Пример использования:
Killtask ('имя жертвы');
Важное замечание
Имя жертвы - это имя запускаемого файла+расширение. Например winlogon.exe.
Комментариев нет:
Отправить комментарий