среда, 18 декабря 2013 г.

Запрет второй копии

Как-то жизнь заставила меня написать программу отображающую технологические процессы предприятия. То есть сидит диспетчер и на экране видит все что творится на объектах предприятия.


Ставить 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.

Комментариев нет:

Отправить комментарий