Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Привет всем!

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

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

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

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

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

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

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

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

Код:
//==================================================================
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, 01:34   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

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

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

Цитата:
Но как получить хэндл зная имя процесса??
Зная имя процесса проще всего найти его 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. Код наскоро набросал, требуется формальная доработочка
I'm learning to live...
Stilet вне форума
Старый 14.01.2008, 14:04   #7
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию Формальная доработка

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

Код:
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 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как убить процесс зная его имя? 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 18:07
Как корректно завершить цикл? Iren Microsoft Office Excel 4 02.11.2007 09:58