Помощь - Поиск - Пользователи - Календарь
Полная версия: Завершение процесса
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
AlexPS
Чуваки, а как завершить процесс из моей проги, например svchost.exe???
ShadowWatcher
Легко и просто. Открываешь его с правом на Terminate и именно это с ним производишь.
xds
В общем виде задача решается с помощью функции TerminateProccess. При вызове ей необходимо указать логический номер (handle), возвращаемый функцией OpenProcess. Последней требуется идентификатор процесса, способы определения которого варьируются для различных реализаций Win32 API (имеется в виду случай, когда нужно завершить процесс, созданный другим приложением).

Вот пример функции, возвращающей идентификатор процесса по имени файла образа:
uses
 Windows, Messages, tlhelp32, psapi, SysUtils;

// Get id of a process
function LocateProcess(const ImageName: String): Integer;
var
 Snapshot,
 ProcessHandle,
 ModuleHandle,
 i: Integer;
 BytesRead: Cardinal;
 ProcessEntry: TProcessEntry32;
 ExeFile: String;
 PIDs: array[0..4095] of DWord;
begin
 Result := 0;
 Snapshot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 SetLength(ExeFile, Length(ImageName));
 if Snapshot <> 0 then
   begin
     // Processes enumeration loop for Windows 9x, Me, 2000
     // ToolHelp32 API
     ProcessEntry.dwSize := SizeOf(TProcessEntry32);
     if Process32First(Snapshot, ProcessEntry) then
       repeat
         if AnsiSameText(ImageName, ExtractFileName(ProcessEntry.szExeFile)) then
           begin
             Result := ProcessEntry.th32ProcessID;
             Break;
           end;
       until not Process32Next(Snapshot, ProcessEntry);
     CloseHandle(Snapshot);
   end
 else
   // Processes enumeration loop for Windows NT, 2000 PSAPI
   if EnumProcesses(@PIDs, SizeOf(PIDs), BytesRead) then
     begin
       for i := 0 to BytesRead shr 2 - 1 do
         begin
           ProcessHandle := OpenProcess(PROCESS_VM_READ or
             PROCESS_QUERY_INFORMATION, False, PIDs[i]);
           if ProcessHandle <> 0 then
             begin
               ExeFile := '';
               if EnumProcessModules(ProcessHandle, @ModuleHandle,
                    SizeOf(ModuleHandle), BytesRead) then
                 GetModuleBaseName(ProcessHandle, ModuleHandle, PChar(ExeFile),
                   Length(ExeFile) + 1);
               CloseHandle(ProcessHandle);
               if AnsiSameText(ImageName, ExeFile) then
                 begin
                   Result := PIDs[i];
                   Break;
                 end;
             end; // then
         end; // for
     end; // then
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.