IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Убить процесс / закрыть программу
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Таков вопрос - как убить процесс/закрыть программу, если после нажатия Ctrl+Alt+Delete в колонке "Имя процесса" его имя, например, StreamingMediaPlayer.exe?
Собственно суть программы такова - запускается другая программа и через несколько сек. надо ее закрыть.
Об API почти ничего не знаю unsure.gif
Нашел несколько подходящих функций/процедур, но среди аргументов - типы Cardinal, Classname. Что это такое? Как найти эти данные для моего процесса?
Спасибо всем, кто откликнется wink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Вот, делал лабу в этом семестре:


// ...
implementation
var
lpStartUpInfo: TStartUpInfo;
ProcessInformation: TProcessInformation;


{$R *.dfm}

function _OpenProcess: Boolean;
begin
RESULT := TRUE;

if frmNewProc.OpenDialog1.Execute then begin

FillChar(lpStartUpInfo, SizeOf(lpStartUpInfo), #0);
lpStartUpInfo.cb := SizeOf(lpStartUpInfo);
lpStartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
lpStartUpInfo.wShowWindow := SW_SHOWNORMAL;

try

if CreateProcess(nil,PChar(frmNewProc.OpenDialog1.FileName),
nil, nil, false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil, nil, lpStartUpInfo, ProcessInformation) then begin
end else begin
MessageDlg('Выбранный файл "' + frmNewProc.OpenDialog1.FileName+ '" не является приложением Win32',
mtInformation, [mbOk], 0);

RESULT := FALSE;
end;

//if WaitForSingleObject(ProcessInformation.hProcess, 10000) = WAIT_TIMEOUT then
//RESULT := FALSE;

except on E: Exception do begin
MessageDlg('Невозможно запустить процесс: ' + E.Message,
mtError, [mbCancel], 0);

RESULT := FALSE;
end;
end;
end else RESULT := FALSE;
end;

function CloseProcess: Boolean;
begin
RESULT := TRUE;
try
TerminateProcess(ProcessInformation.hProcess, 0);
CloseHandle(ProcessInformation.hProcess);
CloseHandle(ProcessInformation.hThread);
except on E: Exception do begin
MessageDlg('Невозможно завершить процесс "' + frmNewProc.OpenDialog1.FileName + '" : ',
mtWarning, [mbOk], 0);
RESULT := FALSE;
end;
end;
end;

//...


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


А что такое frmNewProc? Из-за этого не хочет компилироватся...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
А что такое frmNewProc?
Класс формы, вероятно...

type
frmNewProc = class(TForm)
...
end;


Или у тебя все формы - это экземпляры класса TForm1? wink.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


klem4, volvo, спасибо, разобрался.
Но - как узнать ProcessInformation моего процесса?
Какова ситуация у меня:
На форме поставил TWebBrowser и кнопку. По нажатию кнопки в TWebBrowser посылается URL, после чего запускается плеер для онлайн-воспроизведения, если подключение не удалось - убиваем процесс/закрываем плеер и все по новой. В процессах после Ctrl+Alt+Delete его имя - StreamingMediaPlayer.exe. Дело в том, что на сервере установлен лимит на 15 подключений, и мне хочется сделать автоматический "коннектор" к серверу. Как узнать ProcessInformation процесса? Что это такое? ProcessInformation для каждого процесса, запущенного одним и тм же приложении, уникальный или единый (если последнее, то тогда все проще)? Как, наконец, убить "мой" процесс (плеера)? Еще раз повторюсь, в API - полный нуль unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






У тебя все проще: тебе ведь известно имя EXE-файла...

Drkb -> Системные функции и WinAPI -> Windows -> Работа с чужими процессами -> Как убить задачу, зная только имя .exe?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


volvo, спасибо...
Это я что-то стормозил (вчера эту функцию пробовал, результат - нулевой, сегодня все пошло) no1.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Не совсем по теме, но - как контролировать поведение сторонних программ?Это возможно? Интересует, как можно проконтролировать появление сообщения об ошибке - можно, конечно, делать снимки экрана и проверять цвет в опр. точках lol.gif , но это явно не рационально no1.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Какого рода ошибки ты хочешь ловить? Или ты о предложении послать почту Б.Гейтсу?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Как я уже писал, пишу прогу для поиска свободного места на сервере с видеофильмами. У нас установлен лимит. Если я не попадаю в лимит, то плеер выдает сообщение об ошибке. Можно, конечно, поставить на час-второй выполнение проги, коннектясь с очень малым интервалом времени (если будет свободное место, то никто не успеет его занять, ведь интервал работы программы мал), но лучше, конечно, коннектится до тех пор, пока не перестанет выдавать ошибку плеер.
Поставил интеравал несколько милисекунд, через 3 минуты даже мышкой не можно было двигать lol.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Тебе сюда:
Королевство Дельфи - вопрос № 26074
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Спасибо...
Я совсем не ориентируюсь в API, очень прошу помочь мне в "перехватке" сообщений или дать ссылку на то, где это детально описано wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Ты можешь нормально рассказать, что происходит, когда возникает ошибка, которую ты хочешь отловить? Я ж должен знать, ЧТО ловить! Если выбрасывается какое-нибудь окно с сообщением об ошибке, это одно... А может быть, просто Caption меняется, и там написано: "Извините, произошла ошибка"? Пойми, программа У ТЕБЯ, я не вижу как и что она делает...

Если это не MessageBox - то показывай скриншоты, первый - когда ошибки нет, второй - когда ошибка произошла, чтоб было наглядно видно разницу... будем думать что ловить...

P.S. Информация о хуках есть в Drkb...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Присоеденил скрин.
Если есть конкретный алгоритм перехватки ошибки, в т.ч. в Drkb, просьба дать ссылку.
В принципе, прога уже и сейчас работает идеально, но полная автоматизация ей бы не помешала.
Наперед спасибо. wink.gif


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Автоматизация никогда не помешает smile.gif

Попробуй повесить хук на WH_CBT + HCBT_CREATEWND
Пример вот тут: Hook: WH_CBT выкладывал Krid
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Извини за тупость, но никак не могу разобратся с этими хуками...
Насколько я понял, мне нужен этот код:
function SysExecProc(code:integer;wParam:WPARAM;lParam:LPARAM):longint; stdcall;
var
WndHeader:array [0..MAX_PATH-1] of Char;
begin
Result:=CallNextHookEx(SysHook,code,wParam,lParam);
case code of
HCBT_CREATEWND:
if (IsWindow(wParam) and (PCBTCreateWnd(lParam)^.lpcs^.hwndParent=0) and
(lstrlen(PCBTCreateWnd(lParam)^.lpcs^.lpszName)>0)) then
SaveLog('[Open] '+PCBTCreateWnd(lParam)^.lpcs^.lpszName);

HCBT_DESTROYWND:
if (IsWindow(wParam) and IsWindowVisible(wParam) and (GetParent(wParam)=0)) then
begin
GetWindowText(wParam,WndHeader,MAX_PATH);
if (WndHeader<>'')then
SaveLog('[Close] '+WndHeader);
end;
end;
end;

Что возвращает функция? Какие у нее аргументы? Что за типы WPARAM и LPARAM? wacko.gif Еще видел программы с хуками, там функция возвращает тип LRESULT - что это? Неплохо было бы на примере посмотреть работу программы-перехватчика, но как на зло, все такие программы работают с dll...
Про HCBT_CREATEWND все только на С++... В общем, я в тупике и прошу помощи. unsure.gif
Мне надо следующее - есди вылетает окно, идем дальше, нет - останавливаемся
Залил плеер сюда http://rapidshare.com/files/37709359/Strea...MediaPlayer.msi , для того, что бы увидеть ошибку, пишем в окне браузера ums: wacko.gif
Буду очень признателен за помощь wink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Цитата
Что за типы WPARAM и LPARAM?
Фактически - все три типа = LongInt (так описываются они в Windows.PAS):
type
WPARAM = Longint;
LPARAM = Longint;
LRESULT = Longint;



Цитата
Неплохо было бы на примере посмотреть работу программы-перехватчика, но как на зло, все такие программы работают с dll
Ну, так на то они и ловушки:
Цитата(Drkb)
Итак, существует два типа ловушек - глобальные и локальные. Локальная ловушка отслеживает только те события, которые происходят только в одной программе (или потоке). Глобальная ловушка отслеживает события во всей системе (во всех потоках). Оба типа ловушек устанавливаются одинаково, однако единственно отличие заключается в том, что локальная ловушка вызывается в пределах Вашего приложения, в то время как глобальную ловушку необходимо хранить и вызывать из отдельной DLL.

 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.09.2020 9:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name