Отсортировать выполнение процессов в системе



Автор: Евгений Левшаков
WEB сайт: mcsa.ru

Нужно отсортировать выполнение процессов в системе, т.е. поочередно выполнить несколько процессов, тем самым автоматизировать некоторый " трудовой процесс" ? Этот код предоставляет такую возможность. Вы создаете " кадр" существующих в системе процессов, находите в нем нужный вам процесс по его ID и обрабатываете его сообщение.


unit PIDProcessing;
interface
function PIDExists(PID:Integer):boolean;
function RunProgram(ExeProgram:String):integer;
implementation
uses TLHelp32, Windows;
function PIDExists(PID:Integer):boolean;
{возвращает true, если процесс найден}
var hSnap:Cardinal;
// Snapshot (" кадр" ) запущенных процессов в системе
ProcessEntry:TProcessEntry32;
// информация о процессе
Finding:LongBool;
// возвращает true, 
если первый  процесс скопирован в буфер,
иначе false
Found:Boolean;
// возвращает true, 
если в системе есть запущенные процессы
begin
hSnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
{создаем " кадр"  запущенных процессов}
if hSnap=0 then
begin
Result:=False;
Exit;
end;
Found:=False;
ProcessEntry.dwSize:=SizeOf(ProcessEntry);
Finding:=Process32First(hSnap,ProcessEntry);
{предоставляет информацию
о первом процессе в " кадре" }
While Finding do
begin
if PID=ProcessEntry.th32ProcessID then Found:=True;
{если необходимый процесс найден,
возвращаем true}
Finding:=Process32Next(hSnap,ProcessEntry);
{предоставляет информацию
о следующем процессе в " кадре" }
end;
CloseHandle(hSnap);
Result:=Found;
end;
function RunProgram(EXEProgram:String):Boolean;   
{Возвращает true,
если процесс системы выполнен}
var si:TStartupInfo;   
{определение свойств главного окна,
создаваемого приложения}
pi:TProcessInformation;
{информация о созданном процессе
и его главном потоке}
begin
FillMemory(@si,sizeof(si),0);
si.cb:=Sizeof(si);
Result:=False;
if EXEProgram< > '' then
if CreateProcess(nil,PChar(EXEProgram),
nil,nil,false,
NORMAL_PRIORITY_CLASS,nil,nil,si,pi) then
{создаем процесс}
begin
{до тех пор пока процесс существует в " кадре"
обрабатываем его сообщение}
While PIDExists(pi.dwProcessId)
do Application.ProcessMessages;
CloseHandle(pi.hProcess);
{закрываем процесс}
CloseHandle(pi.hThread);
{останавливаем поток,
порожденный процессом}
Result:=True;
end;
end;
end.


Далее: Передать строки, картинки (streams) между процессами »»