Рейтинг@Mail.ru

WinAPI: Взаимный контроль приложений.


Иногда в своих проектах необходимо реализовать возможность контроля запущенных экземпляров программ или возможность взаимного контроля зависимых друг от друга программ. Для решения этой задачи нам понадобится получить список запущенных процессов.

Как это делается можно прочитать здесь.

А далее, после того как мы получим список процессов, достаточно проверить список на наличие в нем интересующего процесса, соответствующего нашей программе. Если такового не оказалось, то необходимо нашу программу запустить заново.

Теперь посмотрим, как будет выглядеть листинг:

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 - хорошо.
1 звезда2 звезды3 звезды4 звезды5 звёзд (5 голосов, средний: 4,20 из 5)
Loading ... Loading ...

  1. Zero
    29 Январь 2009 в 23:36 | #1

    Отличная статья коффи :)… В тему, хотелось бы побольше статей по безопасности

  2. lizz
    30 Январь 2009 в 03:42 | #2

    @Zero
    Можно и по безопасности, регистрируйтесь на форуме, предлагайте темы, если интересует что-то конкретное ;-).

  1. Пока что нет уведомлений.
*