Запускаю выполнение другой программы при помощи функции 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;
Комментариев нет:
Отправить комментарий