Irinka Вот накатал специально для тебя примерчик. Надеюсь поможет 
| Код | {* * Функция возвращает PID процесса * szFileName - имя искомого процесса (можно передавать путь к файлу целиком) * Функция возвращает PID первого найденого процесса с именем szFileName * Если процесс не найден, то возвращает 0 * * Function retrieve the the process Id * szFileName - process file name to search for * Return value - dwProcessId of first founded process with name szFileName * If process szFileName not founded, then return value is NULL *}
function FindProcess(const szFileName: string): DWORD; var fn: string; aProcesses: array[0..1023] of DWORD; cbNeeded, cProcesses, hProcess, hMod: DWORD; i: Integer; szProcessName: array[0..MAX_PATH - 1] of Char; begin Result := 0;
// вдруг нам передали путь к файлу целиком fn := ExtractFileName(szFileName);
if not EnumProcesses(@aProcesses, SizeOf(aProcesses), cbNeeded) then Exit;
// кол-полученое кол-во процессов cProcesses := cbNeeded div SizeOf(cProcesses);
for i := 0 to cProcesses - 1 do begin // получаем хэндл процесса, что бы узнать имя исполняемого файла hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, aProcesses[i]);
// если удалось открыть объект - процесс, то if hProcess > 0 then begin // перечисляем все модули процесса if EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cbNeeded) then GetModuleBaseName(hProcess, hMod, szProcessName, SizeOf(szProcessName));
// сравниваем с нашим (искомым) процессом if AnsiCompareText(szProcessName, fn) = 0 then Result := aProcesses[i]; end;
// закрываем описатель. Он нам больше не нужен CloseHandle(hProcess); end; end; |
Далее привожу пример, как отыскать процесс с именем notepad.exe и подождать его завершения:| Код | var dwProcessId, hProcess: DWORD; begin dwProcessId := FindProcess('notepad.exe');
if dwProcessId > 0 then if Application.MessageBox(PChar('Ждать завершения процесса с PID = ' + IntToStr(dwProcessId)), nil, MB_ICONQUESTION or MB_YESNO) = ID_YES then begin hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, dwProcessId); if hProcess > 0 then begin Application.MessageBox(PChar('Программа продолжит работу после завершения процесса notepad.exe (PID = ' + IntToStr(dwProcessId) + ')'), nil, MB_ICONWARNING);
// теперь программа продолжит работу // только после завершения процесса notepad.exe while WaitForSingleObject(hProcess, 100) <> WAIT_OBJECT_0 do Application.ProcessMessages;
CloseHandle(hProcess);
// здесь располагается код для выполенния действий // после завершения процесса notepad.exe
Application.MessageBox(PChar('Процесс notepad.exe (PID = ' + IntToStr(dwProcessId) + ') завершил своё существование'), nil, MB_ICONINFORMATION); end; end; end; |
|