|
Вопрос # 3 785/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Вопрос такой: как закрыть программу запущенную функцией ShellExecute?
 |
Вопрос задал: Кириченко Сергей (статус: 1-ый класс)
Вопрос отправлен: 17 февраля 2010, 00:03
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Alexey6522
Здравствуйте, Кириченко!
По форуму конечно походить не судьба, не знал что для закрытия (убить процесс) программы, функцией ShellExecute, нужен какой-то особенный способ, так что же получается для каждого из способово запуска программ нужен свой индивидуальный способ что бы ее потом закрыть ))) насмешил. Я всегда пользуюсь CloseHandle(HWN: THWND); В вопросе # 3 779 это обсуждалось ;) удачи
 |
Ответ отправил: Alexey6522 (статус: 1-ый класс)
Время отправки: 17 февраля 2010, 08:07
|
Мини-форум вопроса
Всего сообщений: 20; последнее сообщение — 23 февраля 2010, 01:20; участников в обсуждении: 4.
|
Мережников Андрей (статус: Абитуриент), 17 февраля 2010, 06:05 [#1]:
как вариант - послать программе сообщение о необходимости закрыться, если это оконное приложение.
|
|
Alexey6522 (статус: 1-ый класс), 17 февраля 2010, 08:09 [#2]:
Блин достали уже эти новички однодневки
|
|
min@y™ (статус: Доктор наук), 17 февраля 2010, 08:12 [#3]:
Цитата (Alexey6522):
Скажи, а какая разница какое это приложение, будь то оконное или без оконное? Блин достали уже эти новички однодневки
Сравни с консольным приложением.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Alexey6522 (статус: 1-ый класс), 17 февраля 2010, 11:38 [#4]:
Консольные приложения тоже отображаются в процессах, cmd.exe
|
|
min@y™ (статус: Доктор наук), 17 февраля 2010, 12:49 [#5]:
Цитата (Alexey6522):
Консольные приложения тоже отображаются в процессах, cmd.exe
Ну тогда попробуй корректно завершить вот такое:
program p1;
{$APPTYPE_CONSOLE}
begin
while true do writeln('killme!');
end.
Тут, кроме как убить процесс, ничего не выйдет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Кириченко Сергей (статус: 1-ый класс), 17 февраля 2010, 13:13 [#6]:
Приложение оконное но к сожалению закрыть с помощью CloseHandle не выходит вот код:
var
IEWnd,IexpHandle:Thandle;
procedure TForm1.Button1Click(Sender: TObject);
begin
IexpHandle:=ShellExecute (IEWnd,'open','c:\Program Files\Plus!\Microsoft Internet\Iexplore.exe','http://mail.ru','',SW_SHOW);
end;
//Каждый раз IexpHandle=42
procedure TForm1.Button2Click(Sender: TObject);
begin
CloseHandle(IexpHandle); //Вызывает исключительную ситуацию 'External EXception C0000008'
end;
|
|
min@y™ (статус: Доктор наук), 17 февраля 2010, 13:29 [#7]:
Цитата (Кириченко Сергей):
//Каждый раз IexpHandle=42
Ясен пень, ты же не удосужился узнать, что на самом деле функция ShellExecute() возвращает, RTFM!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Alexey6522 (статус: 1-ый класс), 17 февраля 2010, 13:56 [#8]:
Как тебе это??? В ответ на твой вопрос попробуй убей это >> while true do writeln('killme!');
Да запросто
uses Tlhelp32;
function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(
PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
KillTask('cmd.exe'); //В кавычках имя экзешника
end;
|
|
Alexey6522 (статус: 1-ый класс), 17 февраля 2010, 14:01 [#9]:
Кто говорил о корректном завершении, в овопросе этого не было, что нужно еще и сохранить данные на диске
|
|
min@y™ (статус: Доктор наук), 17 февраля 2010, 17:42 [#10]:
Цитата (Alexey6522):
Как тебе это??? В ответ на твой вопрос попробуй убей это >> while true do writeln('killme!');
Да запросто
Да я и не говорил, что УБИТЬ невозможно.
Где-то я уже эту функцию видел. Объясни-ка, как она работает.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Кириченко Сергей (статус: 1-ый класс), 18 февраля 2010, 11:07 [#11]:
Приведенный мною код не работает браузер не закрывается. Ошибка появляется если программу запускать со среды разработки, если же запускать в Windows ошибки нет но и результата тоже. Не могли бы вы привести пример как в моем конкретном случае закрыть чертову программу. Спасибо.
|
|
min@y™ (статус: Доктор наук), 18 февраля 2010, 11:36 [#12]:
Чтобы спокойно закрыть окно приложения, надо ему послать сообщение WM_SYSCOMMAND с флагом SC_CLOSE. Чтобы послать сообщение окну, надо знать его Handle. Чтобы узнать Handle, есть функции FindWindow(), EnumWindows(), EnumChildWindows().
Как идентифицировать окно InternetExplorer? Их может быть открыто несколько штук.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 18 февраля 2010, 11:39 [#13]:
И вообще, что за программу ты делаешь? Может в ней можно обойтись без InternetExplorer?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Кириченко Сергей (статус: 1-ый класс), 18 февраля 2010, 13:16 [#14]:
Задача поставлена такая: По нажатии горячих клавиш запустить InternetExplorer чтобы он открылся на странице HTTP://mail.ru/.
По повторном нажатии закрыть InternetExplorer. С задачей я справился другим способом (с помощью OLE), но я хочу разобраться с этим гребаным ShellExecute и как можно использовать Handle который он возвращает.
На форумах и в разных справках по WINAPI я нахожу разные описания
1.Функция возвращает Хендл открытого приложения или сервера DDE. Возвращаемое значение должно быть больше 32.
2.Функция возвращает Хендл экземпляра обьекта. Возвращаемое значение должно быть больше 32.
3.Функция возвращает Хендл окна запущенного приложения или сервера DDE. Возвращаемое значение должно быть больше 32.
И самое интересное что ни один способ закрыть приложение по этому Handle у меня не срабатывал. Вот я и решил прояснить ситуацию у вас.
Так вот как закрыть процесс (окно, приложение, программу) используя Handle возвращаемый фанкцией ShellExecute?
|
|
min@y™ (статус: Доктор наук), 18 февраля 2010, 13:36 [#15]:
Цитата (Кириченко Сергей):
но я хочу разобраться с этим гребаным ShellExecute и как можно использовать Handle который он возвращает.
ShellExecute() НЕ ВОЗВРАЩАЕТ никаких хэндлов! Тебя дезинформировали. Читай ты MSDN, там вот что написано:
Цитата:
Return Value
Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Кириченко Сергей (статус: 1-ый класс), 18 февраля 2010, 14:01 [#16]:
Спасибо. Теперь все ясно. Вот видите меня дезинформировали, а я вам голову морочу.
|
|
min@y™ (статус: Доктор наук), 18 февраля 2010, 14:13 [#17]:
Цитата (Кириченко Сергей):
Спасибо. Теперь все ясно. Вот видите меня дезинформировали, а я вам голову морочу.
"Спасибо" - это много. Достаточно пива или +.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Alexey6522 (статус: 1-ый класс), 18 февраля 2010, 14:26 [#18]:
Во первых что бы закрыть интернет страницу, тебе нужно найти ее по заголовку, в общем вот что у меня получилось
//Открываем страницу
ShellExecute(handle, 'open', 'http://mail.ru/', nil, nil, SW_RESTORE);
end;
// А тут мы ее закрываем, хочу предупредить, если несколько вкладок, закроются все
var
wnd:HWND;
begin
wnd:=FindWindow(nil, '@MAIL.RU: почта, новости, работа, рассылки, развлечения. Почта @MAIL.RU - бесплатная почта #1 -
Mozilla Firefox');
PostMessage(wnd, wm_close,0,0);
|
|
Alexey6522 (статус: 1-ый класс), 18 февраля 2010, 14:32 [#19]:
Если у тебя по умолчанию стоит FireFox какой-нибудь, а ты хочешь открыть с помощью Internet Explorer можешь открыть следующим способом, кстати это выход, так как FireFox открывает в новой вкладке, а если у тебя IExplore 6 версии, тогда лучше этот вариант
WinExec('C:\Program Files\Internet Explorer\IEXPLORE.EXE //mail.ru/', SW_RESTORE);
|
|
Кириченко Сергей (статус: 1-ый класс), 23 февраля 2010, 01:20 [#20]:
Всем большое спасибо за обсуждение.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|