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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2010, 13:03   #1
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию Запуск и закрытие другого приложения

Запускаю другое приложение, через некоторое время оно мне уже не нужно ( через сек.) :

Код:
procedure TForm1.FormCreate(Sender: TObject);
var  h: THandle;
begin
  h:= ShellExecute(Handle, nil, 'D:\Delphi\Программы\Other.exe', nil, nil, SW_SHOWNORMAL);
  Sleep(1000);
  SendMessage(h,WM_DESTROY,0,0);
end;
Но WM_DESTROY не срабатывает, приложение Other.exe остается запущенным. В чем я не прав?
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 18.05.2010, 13:14   #2
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

А если :
Код:
PostMessage(H, WM_QUIT, 0, 0);
?
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 18.05.2010, 13:16   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Код:
postMessage(h, WM_SYSCOMMAND, SC_CLOSE, 0)
и почему sleep, ведь в shellexecute можно задать ожидание окончательного запуска...
Код:
function tfm.ExecAndWait(const ExecuteFile, ParamString : string): boolean;
var
  SEInfo: TShellExecuteInfo;
  ExitCode: DWORD;
begin
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := PChar(ExecuteFile);
    lpParameters := PChar(ParamString);
    nShow := SW_HIDE;
  end;
  if ShellExecuteEx(@SEInfo) then
  begin
    repeat
      Application.ProcessMessages;
      GetExitCodeProcess(SEInfo.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
    Result:=True
  end
  else Result:=False;      
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 18.05.2010, 13:55   #4
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Не-а!
Код:
PostMessage(H, WM_QUIT, 0, 0);
также
Код:
postMessage(h, WM_SYSCOMMAND, SC_CLOSE, 0)
не закрывают приложение.
Цитата:
и почему sleep ?
Запускаю из своего приложения через ShellExecute чужое, делаю паузу в 1 сек. и хочу, за ненадобностью, закрыть чужое приложение.
А вот функцию function tfm.ExecAndWait , честно говоря, не понимаю.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 18.05.2010, 14:33   #5
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Откопал в Delphi Russian Knowledge Base

Код:
 uses  Tlhelp32, Windows, SysUtils; 


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
   ShellExecute(Handle, nil, 'D:\Delphi\Программы\Other.exe', nil, nil, SW_SHOWNORMAL);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  KillTask('Other.exe');
end;
Работает и по кнопке и в FormCreate после заданной задержки.
Вопрос закрыт.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 18.05.2010, 15:01   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

GetExitCodeProcess возвращает управление, когда приложение запустилось полностью, а sleep это эмпирическое использование и будет работать отлично при некой определенной загруженности системы, а ведь приложение может и не успеть за 1000мс запуститься и выполнить то чего ему нужно.

WM_SYSCOMMAND влияет, если у чужого приложения системное меню имеется ...TerminateProcess - ну дык правильно, тут мы процесс убиваем не интересуясь видом окон и прочей ерундой
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 18.05.2010 в 15:04.
raxp вне форума Ответить с цитированием
Старый 18.05.2010, 16:07   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Просто ShellExecute возвращает не дескриптор процесса (который на NT-системах для PE-exe к тому же всегда равен базовому адресу загрузки), и уж тем более не дескриптор окна, которому можно послать сообщение, а какую-то хрень
Цитата:
The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE
пыщь
JTG вне форума Ответить с цитированием
Старый 18.05.2010, 17:12   #8
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Вот и я так понял, что var h: THandle; в #1 не работает. Пробовал и через h: HWND - то же.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 18.05.2010, 18:39   #9
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

DRKB - местами такой сборник мусора Что если закроется не наш other.exe?

Код:
var success: longbool;
    SI: TStartupInfo;
    PI: TProcessInformation;
begin

  FillChar(SI, SizeOf(TStartupInfo), 0);
  with SI do
  begin
    cb := SizeOf(TStartupInfo);
    dwFlags := STARTF_FORCEONFEEDBACK + STARTF_USESHOWWINDOW;
    wShowWindow := SW_SHOWNORMAL;
  end;

  success := CreateProcess('D:\Delphi\Программы\Other.exe', '', nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI)
  if success then 
    begin
    //  WaitForInputIdle(PI.hProcess, INFINITE); //можно подождать пока процесс получит управление
      CloseHandle(PI.hThread)  //мусор
    end
  else Win32Check(success);    //обёртка над GetLastError

  ... блаблабла ...

  TerminateProcess(PI.hProcess, 0);
  CloseHandle(PI.hProcess);
end;
Хотя принудительно завершать процесс тоже не есть гуд. Если у него есть окно - можно получить hWnd по PID (PI.dwProcessID) - код на бейсике и уже ему послать WM_CLOSE. Если откажется - тогда прибить.
пыщь

Последний раз редактировалось JTG; 19.05.2010 в 00:17. Причина: fix
JTG вне форума Ответить с цитированием
Старый 18.05.2010, 20:41   #10
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Цитата:
Что если закроется не наш other.exe?
Это как понять? Ведь функция KillTask (из поста #5) определенно адресная и указывает на конкретное приложение.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие приложения. docbrain Помощь студентам 8 06.02.2010 05:27
Запуск другого приложения Sparky Общие вопросы по Java, Java SE, Kotlin 3 18.10.2009 11:03
Запрет на закрытие чужого приложения S@fer Win Api 2 12.07.2009 19:47
Правильное закрытие приложения в Delphi 7 Alex Cones Общие вопросы Delphi 5 18.04.2009 22:06
Закрытие приложения Лёка Общие вопросы Delphi 7 09.03.2008 15:50