Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Название темы включает слова - "Помогите", "Спасите", "Срочно"
Название темы не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте >>>правила <<< и заново правильно создайте тему.
 
Опции темы
Старый 14.01.2008, 00:13   #1
Никки
Участник клубаФорумчанин
 
Аватар для Никки
 
Регистрация: 20.11.2007
Адрес: Пермь
Сообщений: 500
Репутация: 108

icq: 325023270
Вопрос Как завершить процесс, зная его имя

Привет всем!

Ну в принципе теоретически понятно как, надо молучить HANDLE процезза и завершить его функцией CloseWindow();

Но как получить хэндл зная имя процесса?? Я получал его по имени окна, но потом не мог его закрыть приведённой выще функцией!! Напишите кто знает как!!

Зарание огромное спасибо!!
Никки вне форума  
Старый 14.01.2008, 00:18   #2
mihali4
*
Профессионал
 
Регистрация: 22.11.2006
Адрес: Москва
Сообщений: 9,201
Репутация: 2695
По умолчанию

Господи, когда же они начнут пользоваться поиском по форуму? Вразуми их, господи, иначе я возьму дубину и буду вразумлять сам...

SendMessage(FindWindow(nil,'Caption окна'),WM_Close,0,0);
mihali4 вне форума  
Старый 14.01.2008, 00:20   #3
Никки
Участник клубаФорумчанин
 
Аватар для Никки
 
Регистрация: 20.11.2007
Адрес: Пермь
Сообщений: 500
Репутация: 108

icq: 325023270
По умолчанию

Да, но у меня нет имя окна, у меня есть только имя процесса!

Темы тоже надо внимательно читать!
Никки вне форума  
Старый 14.01.2008, 01:03   #4
AnalogXP
Пользователь
 
Аватар для AnalogXP
 
Регистрация: 11.01.2008
Сообщений: 42
Репутация: 10
По умолчанию

Я когдато так убивал программы:

Код:
//==================================================================
function GetLastErrorString: string;
var
  lz: Cardinal;
  lErr: array[0..512] of Char;
begin
  lz := GetLastError;
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, lErr, 512, nil);
  Result := string(lErr);
end;
//==================================================================
function GetProcessID(const AProcessName: string): DWord;
var
  lSnapHandle: THandle;
  lProcStruct: PROCESSENTRY32;
  lProcessName, lSnapProcessName: string;
  lOSVerInfo: TOSVersionInfo;
begin
  Result := INVALID_HANDLE_VALUE;
  lSnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  if lSnapHandle = INVALID_HANDLE_VALUE then
    Exit;
  lProcStruct.dwSize := SizeOf(PROCESSENTRY32);
  lOSVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(lOSVerInfo);
  case lOSVerInfo.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS: lProcessName := AProcessName;
    VER_PLATFORM_WIN32_NT: lProcessName := ExtractFileName(AProcessName);
  end;
  if Process32First(lSnapHandle, lProcStruct) then
  begin
    try
      repeat
        lSnapProcessName := lProcStruct.szExeFile;
        if AnsiUpperCase(lSnapProcessName) = AnsiUpperCase(lProcessName) then
        begin
          Result := lProcStruct.th32ProcessID;
          Break;
        end;
      until not Process32Next(lSnapHandle, lProcStruct);
    finally
      CloseHandle(lSnapHandle);
    end;
  end;
end;
//==================================================================
function KillProcess(const AProcessName: string): Boolean;
var
  lPID, lCurrentProcPID: DWord;
  lProcHandle: DWord;
begin
  Result := False;
  try
    lCurrentProcPID := GetCurrentProcessId;
    lPID := GetProcessID(AProcessName);
    if (lPID <> INVALID_HANDLE_VALUE) and (lCurrentProcPID <> lPID) then
    begin
      lProcHandle := OpenProcess(PROCESS_TERMINATE, False, lPID);
      Windows.TerminateProcess(lProcHandle, 0);
      WaitForSingleObject(lProcHandle, Infinite);
      CloseHandle(lProcHandle);
      Result := True;
    end;
  except
    raise EExternalException.Create(GetLastErrorString);
  end;
end;
Вызывал:
Код:
KillProcess(путь к программе);
AnalogXP вне форума  
Старый 14.01.2008, 02:34   #5
mihali4
*
Профессионал
 
Регистрация: 22.11.2006
Адрес: Москва
Сообщений: 9,201
Репутация: 2695
По умолчанию

Цитата:
Сообщение от Никки Посмотреть сообщение
Да, но у меня нет имя окна, у меня есть только имя процесса!

Темы тоже надо внимательно читать!
Это кто писал? Я?
Цитата:
как получить хэндл зная имя процесса?? Я получал его по имени окна
mihali4 вне форума  
Старый 14.01.2008, 10:15   #6
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,840
Репутация: 6850
По умолчанию

Цитата:
Но как получить хэндл зная имя процесса??
Зная имя процесса проще всего найти его ID через ToolHelp32 и закрыть через TerminateProcess
типа такого:
Код:
var p:PROCESSENTRY32;ct:cardinal;th:Cardinal;
begin
ct:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
 Process32First(ct,p);
 while Process32Next(ct,p) do begin
  if p.szExeFile='winamp.exe' then
  begin
    th:=OpenProcess(PROCESS_ALL_ACCESS,false,p.th32ProcessID);
   TerminateProcess(th,0);
  end;
 end;  {}
 end;
P.S. Код наскоро набросал, требуется формальная доработочка
Stilet вне форума  
Старый 14.01.2008, 15:04   #7
Air
ПрофессионалФорумчанин
 
Аватар для Air
 
Регистрация: 30.04.2007
Адрес: © "Там, где нас нет"
Сообщений: 1,297
Репутация: 372
По умолчанию Формальная доработка

Для обычных ЕХЕ файлов действует безотказно:

Код:
uses Tlhelp32;
...
function KillTask(ExeFileName:string):integer;
const
PROCESS_TERMINATE=$0001;
var
Co:BOOL;
FS:THandle;
FP:TProcessEntry32;
begin
result:=0;
FS:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FP.dwSize:=Sizeof(FP);
Co:=Process32First(FS,FP);
while integer(Co) <> 0 do
begin
if ((UpperCase(ExtractFileName(FP.szExeFile))=UpperCase(ExeFileName)) or
(UpperCase(FP.szExeFile)=UpperCase(ExeFileName))) then
Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
FP.th32ProcessID),0));
Co:=Process32Next(FS,FP);
end;
CloseHandle(FS);
end;
__________________
Всё гениальное - просто!
Air вне форума  
Закрытая тема

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как убить процесс зная его имя? One.Love Win Api 14 18.02.2012 14:31
Завершить приложения EdNovice Общие вопросы Delphi 4 16.05.2008 08:06
Завершить процесс doniyor Win Api 2 15.05.2008 21:52
снова завершить процесс WOLFak Win Api 10 22.01.2008 19:07
Как корректно завершить цикл? Iren Microsoft Office Excel 4 02.11.2007 10:58


17:13.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.