Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Закрытие программы [Delphi] (https://forum.antichat.xyz/showthread.php?t=43025)

Isis 24.06.2007 22:11

ВОзникла проблема с закрытием стороней программы...
Вообщем я сделла чтобы через мою прогну можно было открыть другую..
Код:

AppHI := ShellExecute(Handle, 'open',PChar(Edit3.Text), nil, nil, SW_SHOWNORMAL);
Но вот мне надо сделать чтобы можно было закрыть её через мою прогу...
Программа, которую запускаю через свою прогу - консольная....

Isis 24.06.2007 22:21

Цитата:

Сообщение от iNVLose
Код:

Q-74: Как закрыть внешнюю программу?

 Например,  Блокнот  можно  закрыть  так:
 
 procedure  TForm1.Button1Click(Sender:  TObject);
 var
    phandle  :  HWND;
 begin
    phandle  :=  FindWindow('Notepad',  nil);
    if  phandle  =  0  then
          RaiseLastWin32Error;
    SendMessage(phandle,  WM_CLOSE,  0,  0);
 end;

_http://www.podgoretsky.com/ftp/Language/nps/ru.delphi.html#N74

некорректно терминэйтпроцесс..

Ну мне это ниче не дало...

Программа консольная, заголовки окна все время меняются...

Isis 24.06.2007 22:27

Программа консольная, заголовки окна все время меняются...

Isis 24.06.2007 22:30

Pid ведь всегда меняется :(

Joker-jar 25.06.2007 01:56

Isis, небольшой примерчик:
Код:

var
  appname: string;
  start: TStartupInfo;
  procInfo: TProcessInformation;
begin
  appname := 'cmd.exe';
  fillchar(start, sizeof(start), 0);
  fillchar(procInfo,sizeof(procInfo), 0);
  CreateProcess(nil,pchar(appname),nil,nil,false,0,nil,nil,start,procInfo);
  sleep(1000);
  TerminateProcess(procInfo.hProcess,0);
end;


Isis 25.06.2007 02:17

Цитата:

Сообщение от Joker-jar
Isis, небольшой примерчик:
Код:

var
  appname: string;
  start: TStartupInfo;
  procInfo: TProcessInformation;
begin
  appname := 'cmd.exe';
  fillchar(start, sizeof(start), 0);
  fillchar(procInfo,sizeof(procInfo), 0);
  CreateProcess(nil,pchar(appname),nil,nil,false,0,nil,nil,start,procInfo);
  sleep(1000);
  TerminateProcess(procInfo.hProcess,0);
end;



Хм, т.е. можно прогу закрыть по имени в процессах?

Joker-jar 25.06.2007 02:26

Не, appname := 'cmd.exe'; это я для примера запускаю консоль. CreateProccess создает процесс, структура procInfo заполняется информацией о процессе. Завершается процесс через TerminateProcess (подается procInfo.hProcess - хэндл созданного процесса). В примере через секунду. Тебе нужно будет procInfo объявить как глобальную, зарершить процесс сможешь когда тебе угодно.

Isis 25.06.2007 03:51

Ну тут опять надо знать заголовок проги, а он постояно меняется =\

NetMan 25.06.2007 09:59

Isis, в примере, что дал Joker-jar не надо знать заголовок окна.

_Great_ 25.06.2007 11:21

Цитата:

Сообщение от Isis
Ну тут опять надо знать заголовок проги, а он постояно меняется =\

Ты не понял примера. Там запуск идет не через shellexecute, а через createprocess, что, кстати, более красиво, но суть не в том.
CreateProcess, если запуск прошел удачно, вернет тебе ThreadId, ProcessId, hThread, hProcess созданного процесса. Дальше можно смело орудовать этими значениями (конечно, стоит их гдето сохранить). Потом вызовешь TerminateProcess(pi.hProcess, 0) и все.

Кстати, а каким боком вопрос относится к дельфи? Тему разделяю.. автору -


Время: 14:05