Страницы

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

понедельник, 19 ноября 2018 г.

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

Запускаю выполнение другой программы при помощи функции 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('Работа завершена');


Ответ

Ответ - никак.
Функция 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;

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

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