Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Как вывести сообщение после выполнения ShellExecute?

#windows #delphi


Запускаю выполнение другой программы при помощи функции ShellExecute:

SPar := тут любая команда;
// Тут выполнения функции
ShellExecute(Handle, nil, 'cmd.exe', PChar(SPar), nil, SW_Hide);


Как показать сообщение после того как функция ShellExecute завершит свою работу?

Я предполагаю что то типа этого или как правильней будет?

if ShellExecute(Handle, nil, 'cmd.exe', PChar(SPar), nil, SW_Hide) = ??? then
  ShowMessage('Работа завершена');

    


Ответы

Ответ 1



Ответ - никак. Функция ShellExecute не позволяет получить информацию о времени жизни программы. Данная функция является устаревшей и не рекомендуется к использованию. Вам нужно вызвать функцию ShelExecuteEx или CreateProcess (в данном конкретном случае лучше последнюю), получить хендл запущенного процесса и дождаться завершения этого процесса при помощи функции WaitForSingleObject var LCmd: string; LInfo: TStartupInfo; LPI: TProcessInformation; begin // Заполняем структуры LCmd := 'cmd.exe ' + SPar; FillChar(LInfo, SizeOf(LInfo), 0); LInfo.cb := SizeOf(LInfo); LInfo.dwFlags := STARTF_USESHOWWINDOW; LInfo.wShowWindow := SW_HIDE; // Запускаем программу Win32Check(CreateProcess( 'cmd.exe', // lpApplicationName, PChar(LCmd), // lpCommandLine, nil, // lpProcessAttributes, nil, // lpThreadAttributes, False, // bInheritHandles, CREATE_NO_WINDOW, // dwCreationFlags, nil, // lpEnvironment, nil, // lpCurrentDirectory, LInfo, // lpStartupInfo, LPI // lpProcessInformation )); try // Закрываем хендл главного потока (он нам не нужен) CloseHandle(LPI.hThread); // Ждем завершения процесса Win32Check(WaitForSingleObject(LPI.hProcess, INFINITE) <> WAIT_FAILED); finally // Закрываем хендл процесса CloseHandle(LPI.hProcess); end; ShowMessage('Программа завершена'); end;

Комментариев нет:

Отправить комментарий