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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2007, 23:32   #1
Viteef
stopfake.org
Участник клуба
 
Регистрация: 03.05.2007
Сообщений: 1,927
Стрелка Завершение работы чужой программы

Как можно закрыть другую программу? Очень надо. Спасибо.
Viteef вне форума Ответить с цитированием
Старый 27.05.2007, 15:47   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

по какому параметру тебе надо закрыть?
вот закрытие процесса по ID

Код:
hProcess := OpenProcess(PROCESS_TERMINATE, false, ProcessID);
if hProcess > 0 then
  begin
    TerminateProcess(hProcess, 0);
     CloseHandle(hProcess);
  end;
rpy3uH вне форума Ответить с цитированием
Старый 27.05.2007, 18:38   #3
Viteef
stopfake.org
Участник клуба
 
Регистрация: 03.05.2007
Сообщений: 1,927
Печаль

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
по какому параметру тебе надо закрыть?
[/code]
Ну не знаю! Задача такая: надо перезапустить программу, которая сидит в ОЗУ, запускаю ее без проблем через WinExec, а вот с завершением...
Viteef вне форума Ответить с цитированием
Старый 28.05.2007, 20:06   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

получение ID процесса по его имени
Код:
function GetProcessId(pName: PChar): dword;
var
 Snap: dword;
 Process: TPROCESSENTRY32;
begin
  Result := 0;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
      Process.dwSize := SizeOf(TPROCESSENTRY32);
      if Process32First(Snap, Process) then
         repeat
          if lstrcmpi(Process.szExeFile, pName) = 0 then
             begin
              Result := Process.th32ProcessID;
              CloseHandle(Snap);
              Exit;
             end;
         until not Process32Next(Snap, Process);
      Result := 0;
      CloseHandle(Snap);
     end;
end;
получив ID, убивай выше приведённым способом
rpy3uH вне форума Ответить с цитированием
Старый 29.05.2007, 14:51   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Бее, гадость
Цитата:
запускаю ее без проблем через WinExec, а вот с завершением...
winexec тока в вирусах и применять - параметров мало, десяток байт сэкономить, эта функция устарела, рой в сторону CreateProcess или CreateProcessEx, тогда, как говорил классик, "я тебе породив, я тебе і вб'ю" =)
пыщь
JTG вне форума Ответить с цитированием
Старый 29.05.2007, 23:11   #6
Viteef
stopfake.org
Участник клуба
 
Регистрация: 03.05.2007
Сообщений: 1,927
Лампочка

Цитата:
Сообщение от JTG Посмотреть сообщение
Бее, гадость

winexec - параметров мало, десяток байт сэкономить, эта функция устарела
А все-таки в моем случае WinExec вполне подходит, и не надо ничего выдумывать с CreateProcess и ему подобными...
Viteef вне форума Ответить с цитированием
Старый 30.05.2007, 17:02   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
Радость

Ну вот такая фигня - либо просто создать с WinExec но мудрить с PIDами чтоб завершить, либо мудрить с CreateProcess и легко завершить по TerminateProcess, поскольку будем иметь handle. Второй способ лучше тем, что можно следить за процессом, проверить работает ли он ещё и т.п.

И не так тут всё сложно (запустить)
Код:
var
  PI: TProcessInformation;
  SI: TStartupInfo;

function LamaCreateProcess(FilePath :string): string;
begin
  FillMemory(@SI, sizeof(SI), 0);
  SI.cb := sizeof(SI);

  CreateProcess(Nil,PChar(FilePath),Nil, Nil, False,
                      NORMAL_PRIORITY_CLASS, Nil, Nil,SI,PL);
end;
Завершить ещё проще
Код:
 TerminateProcess(PI.hProcess,0);
---
А, да зыбыл, если совсем по правилам то
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
надо по Form.onclose сделать, чтоб в памяти не гадить
пыщь

Последний раз редактировалось JTG; 30.05.2007 в 17:11.
JTG вне форума Ответить с цитированием
Старый 03.09.2007, 17:22   #8
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение Весчь!!

А ещё можно так( обмануть проги, даже Каспера ):
типа завершение Виндовс идёт
procedure TForm1.Button1Click(Sender: TObject);
Type EXE = RECORD
Nm :String;
Cls :String;
END;
VAR
H :HWND; TExe :EXE; WCls :ARRAY[0..255]of Char;
begin
Texe.Nm := 'Имя программы - Заголовок';
H := FindWindow(nil, PChar(TExe.Nm));
GetClassName(H, WCls, SizeOF(WCls));
TExe.Cls := String( WCls );
H := FindWindow(PChar(TExe.Cls), PChar(TExe.Nm));
PostMessage(H, wm_endsession, 0, 0);
PostMessage(H, WM_QUERYENDSESSION, 0, 0);
end;
Alter вне форума Ответить с цитированием
Старый 03.09.2007, 19:25   #9
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Каспера так не обманешь (если включена самозащита, а она включена по умолчанию), сервисная часть останется в памяти и будет молча блокировать выполнение подозрительных программ/скриптов... - при попытке запустить какой-нить ехешник с трояном, например, будет стандартное виндовое окно "Невозможно получить доступ к файлу, т.к. файл занят другим процессом" или "Невозможно произвести чтение с диска"...

(гараздо интереснее, если прибить сервис, оставив при этом оболочку - он тада в панике маячит в трее восклицательным знаком, и орёт, типа нарушен механизм защиты

кстати при выключении винды сервис продолжает работает даже после остановки рабочей станции до самого конца, фиг-где найдёшь вирус, который тоже сможет в это время работать
пыщь

Последний раз редактировалось JTG; 03.09.2007 в 19:27.
JTG вне форума Ответить с цитированием
Старый 06.09.2007, 17:17   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Каспера так не обманешь (если включена самозащита, а она включена по умолчанию), сервисная часть останется в памяти и будет молча блокировать выполнение подозрительных программ/скриптов... - при попытке запустить какой-нить ехешник с трояном, например, будет стандартное виндовое окно "Невозможно получить доступ к файлу, т.к. файл занят другим процессом" или "Невозможно произвести чтение с диска"...

(гараздо интереснее, если прибить сервис, оставив при этом оболочку - он тада в панике маячит в трее восклицательным знаком, и орёт, типа нарушен механизм защиты

кстати при выключении винды сервис продолжает работает даже после остановки рабочей станции до самого конца, фиг-где найдёшь вирус, который тоже сможет в это время работать
Хочешь позабавиться с Kaспеrom тогда используй это{когда надо разблокировать выгрузи прогу}:

Последний раз редактировалось Alter; 21.02.2008 в 19:17.
Alter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти Handle Edit'а в окне чужой программы nechto Общие вопросы Delphi 32 05.03.2008 19:41
Запуск своего модуля из чужой программы Volkogriz Общие вопросы Delphi 7 16.10.2007 05:19
Винда ХР не хочет завершаться. Остается экран "Завершение работы компьютера" mitrandir Софт 7 12.06.2007 08:59
завершение работы оператора If Noor Общие вопросы C/C++ 1 14.03.2007 10:07