Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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



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

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

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

Код:

 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, 14:03   #33
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 4,574
Репутация: 1397
По умолчанию

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

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

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

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

Цитата:
Сообщение от 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, 16:28   #35
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 8,585
Репутация: 1322

icq: 216409213
По умолчанию

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

Цитата:
Сообщение от 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, 22:13   #37
demon31
Пользователь
 
Регистрация: 17.05.2015
Сообщений: 28
Репутация: 10
По умолчанию

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отследить разбегание Sashenka1 Общие вопросы Delphi 0 04.04.2016 17: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




03:32.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
таргетированный трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru