Иногда в своих проектах необходимо реализовать возможность контроля запущенных экземпляров программ или возможность взаимного контроля зависимых друг от друга программ. Для решения этой задачи нам понадобиться получить список запущенных процессов.
А далее, после того как мы получим список процессов, достаточно проверить список на наличие в нем интересующего процесса соответствующего нашей программе. Если такового не оказалось, то необходимо нашу программу запустить заново.
Теперь посмотрим как будет выглядеть листинг:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | //глобальные переменные 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; |
Вот и все!
Отличная статья коффи :)… В тему, хотелось бы побольше статей по безопасности
Можно и по безопасности, регистрируйтесь на форуме, предлагайте темы, если интересует что-то конкретное ;-).