WinAPI: Взаимный контроль приложений.
23 Январь 2009
Иногда в своих проектах необходимо реализовать возможность контроля запущенных экземпляров программ или возможность взаимного контроля зависимых друг от друга программ. Для решения этой задачи нам понадобится получить список запущенных процессов.
Как это делается можно прочитать здесь.
А далее, после того как мы получим список процессов, достаточно проверить список на наличие в нем интересующего процесса, соответствующего нашей программе. Если такового не оказалось, то необходимо нашу программу запустить заново.
Теперь посмотрим, как будет выглядеть листинг:
Delphi
//глобальные переменные var lstprc: TStrings; i:integer; find:boolean; //Получаем список процессов function GetProcessList(): TStrings; var eP: TProcessEntry32; hP, snap: THandle; //дескрипторы процесса и снимка hM: hmodule; //дескриптор модуля prcs: array[0..$FFF] of dword; //массив для хранения // дескрипторов процессов cP, cM: cardinal; //количество процессов i: integer; NameProc: array[0..max_path] of char; //имя модуля lP: TStrings; begin lP:=TStringList.Create; lP.Clear; //проверяем версию винды if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin //если это Win9x //инициализируем переменные snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0); if integer(snap) = -1 then begin exit; end else begin eP.dwSize := sizeof(eP); //для Win9x получение списка процессов выполняется по //аналогии с поиском файлов //вызываем функцию для получения первого процесса if Process32First(snap, eP) then //а далее в цикле пока еще есть процессы получаем следующий repeat lP.Add(string(eP.szExeFile));//получаем имя процесса until not Process32Next(snap, eP); end; end else begin //Если WinNT/2000/XP //то в этом случае мы пользуемся Api-функцией перечисления // запущенных процессов //которая заполняет нам наши переменные if not EnumProcesses(@prcs, sizeof(prcs), cP) then begin exit; end; //и далее для каждого дескриптора процесса получаем о нем // информацию for i := 0 to cP div 4 - 1 do begin hP := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, prcs[i]); if hP > 0 then begin EnumProcessModules(hP, @hM, 4, cM); GetModuleFileNameEx(hP, hM, NameProc, sizeof(NameProc)); lP.Add(ExtractFileName(string(NameProc))); //если вы хотите // получить только имена процессов // lP.Add(string(NameProc)); //если вы хотите получить // имена процессов вместе c путем CloseHandle(hP); end; end; end; GetProcessList:=lP; //возвращаем полученный список end; //Основная процедура begin //Сразу после запуска получаем список процессов lstprc:=TStringList.Create; lstprc.Clear; lstprc:=GetProcessList; //Теперь проверяем список на наличие интересующего // нас процесса i:=0; find:=false; while (i <= lstprc.count-1) do begin if lstprc.Strings[i] = 'test.exe' then begin find:=true; break; end else i:=i+1; end; //Если в списке процессов нашей программы // не обнаружено, то мы ее запускаем if not find then WinExec(PChar('test.exe'),SW_SHOW); end;
Вот и все! =)


(5 голосов, средний: 4,20 из 5)
Отличная статья коффи :)… В тему, хотелось бы побольше статей по безопасности
@Zero
Можно и по безопасности, регистрируйтесь на форуме, предлагайте темы, если интересует что-то конкретное ;-).