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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2016, 11:50   #31
demon31
Пользователь
 
Регистрация: 17.05.2015
Сообщений: 28
По умолчанию

Мне и стандартный подходит, только нужно отследить как-то закрытие.
demon31 вне форума Ответить с цитированием
Старый 16.12.2016, 11:56   #32
demon31
Пользователь
 
Регистрация: 17.05.2015
Сообщений: 28
По умолчанию

Я видел такой код, но он вроде не работает, я пытался разобраться, но так и не отследил завершение .-.

Код:
 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;
demon31 вне форума Ответить с цитированием
Старый 16.12.2016, 13:03   #33
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Нужно указать SEE_MASK_NOCLOSEPROCESS
Ну дальше можно прямо ожидать завершения процесса WaitForSingleObject

Ref:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

PS.
Я даже не знал, что ShellExecuteEx возвращает hProcess...

Последний раз редактировалось waleri; 16.12.2016 в 13:17.
waleri на форуме Ответить с цитированием
Старый 16.12.2016, 15:10   #34
demon31
Пользователь
 
Регистрация: 17.05.2015
Сообщений: 28
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Нужно указать SEE_MASK_NOCLOSEPROCESS
Я перепробовал все примеры, и ничего не добился, как это применить сюда?

Код:
procedure ShellExecute(const AWnd: HWND; const AOperation, AFileName: String; const AParameters: String = ''; const ADirectory: String = ''; const AShowCmd: Integer = SW_SHOWNORMAL);
var
  ExecInfo: TShellExecuteInfo;
  ExitCode: DWORD;
  PI: TProcessInformation;
  Result: Boolean;
begin
  Assert(AFileName <> '');

  CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE);
  try
    FillChar(ExecInfo, SizeOf(ExecInfo), 0);
    ExecInfo.cbSize := SizeOf(ExecInfo);

    ExecInfo.Wnd := AWnd;
    ExecInfo.lpVerb := Pointer(AOperation);
    ExecInfo.lpFile := PChar(AFileName);
    ExecInfo.lpParameters := Pointer(AParameters);
    ExecInfo.lpDirectory := Pointer(ADirectory);
    ExecInfo.nShow := AShowCmd;
    ExecInfo.fMask := SEE_MASK_FLAG_DDEWAIT
                   or SEE_MASK_FLAG_NO_UI or SEE_MASK_NOCLOSEPROCESS;
    {$IFDEF UNICODE}
   ExecInfo.fMask := ExecInfo.fMask or SEE_MASK_UNICODE;
    {$ENDIF}

    {$WARN SYMBOL_PLATFORM OFF}
    Win32Check(ShellExecuteEx(@ExecInfo));
    {$WARN SYMBOL_PLATFORM ON}
  finally
    CoUninitialize;
  end;
end;
Код:
ShellExecute(Handle, '', ListBox1.Items.Strings[k]);
demon31 вне форума Ответить с цитированием
Старый 16.12.2016, 15:28   #35
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Забрать из ExecInfo хендл процесса, проверить его на нулл и отдать вейту
p51x на форуме Ответить с цитированием
Старый 16.12.2016, 15:31   #36
demon31
Пользователь
 
Регистрация: 17.05.2015
Сообщений: 28
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Забрать из ExecInfo хендл процесса, проверить его на нулл и отдать вейту
Да не понимаю я как это сделать ....

Делал сейчас вот так, но не получилось.

Код:
 try
      Win32check( ShellExecuteEx( ProcInfo ) );
      while not Application.Terminated and
      ( WaitForSingleObject( ProcInfo.hProcess, 100 ) = WAIT_TIMEOUT ) do
        Application.ProcessMessages;
   finally
      if ProcInfo.hProcess <> 0 then
         CloseHandle( ProcInfo.hProcess );
      Dispose( ProcInfo );
   end;
demon31 вне форума Ответить с цитированием
Старый 16.12.2016, 21:13   #37
demon31
Пользователь
 
Регистрация: 17.05.2015
Сообщений: 28
По умолчанию

Цитата:
Сообщение от demon31 Посмотреть сообщение
Делал сейчас вот так, но не получилось.
Не знаю что там происходило, на это работает, почему-то на компе не работало, на ноуте всё как надо работает.
Спасибо за помощь, тем кто давал дельные советы!!!
demon31 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отследить разбегание Sashenka1 Общие вопросы Delphi 0 04.04.2016 16:40
Отследить ошибку LuxMi C# (си шарп) 5 01.02.2013 09:25
Отследить программу Михаил Юрьевич Общие вопросы Delphi 6 09.09.2012 17:06
Отследить проблему giarmul JavaScript, Ajax 0 09.08.2010 20:49
Отследить стринги san72 Общие вопросы Delphi 2 30.05.2009 17:40