Главная > Программирование, системное > WinAPI: Взаимный контроль приложений на Delphi.

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; [/code] Вот и все!

Пожалуйста, оцените полезность и качество данной статьи. Одна звезда - плохо, 5 - хорошо.
1/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.2/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.3/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.4/5.5/5. (4 голосов, средний: 5,00 из 5)
Загрузка...
  1. Zero
    29 января 2009 в 23:36 | #1

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

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

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

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