Форум: "Начинающим";
Текущий архив: 2016.02.14;
Скачать: [xml.tar.bz2];
ВнизЗапустить другую программу и дождаться завершения(или таймер) Найти похожие ветки
← →
SchoolBase (2014-07-24 19:27) [0]Доброго времени суток.
Необходимо запустить из своего приложения другое (консольное) и дождаться его завершения или же ждать 10 минут и перезапустить консольное приложение.
В интернете полно примеров на запуск другой программы и ожидания её завершения, но почему-то в тех примерах, где используетсяCreateProcess
вылетает ошибка
Project Project1.exe raised exception class $C0000005 with message "access violation at 0x767db783: write of address 0x005d7610".
Access violation at address 767DB783 in module "kernel32.dll". Write of address 005D7610.
Win 7x64 + Delphi XE6
← →
junglecat (2014-07-24 19:32) [1]вылетает именно на CreateProcess?
без кода сложно сказать
← →
SchoolBase (2014-07-24 19:53) [2]Ну, если нажать на Break, то выделяется строка именно с CreateProcess
Вот пример кода:procedure TForm1.Button1Click(Sender: TObject);
function ExecuteAndWait(FileName: string; HideApplication: boolean): boolean;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
exitc: cardinal;
begin
FillChar(StartupInfo, sizeof(StartupInfo), 0);
with StartupInfo do
begin
cb := sizeof(StartupInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_SHOW;
end;
if not CreateProcess(nil, PChar(FileName), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
result := false
else
begin
if HideApplication then
begin
Application.Minimize;
ShowWindow(Application.Handle, SW_HIDE);
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
end
else
while WaitforSingleObject(ProcessInfo.hProcess, 100) = WAIT_TIMEOUT do
begin
Application.ProcessMessages;
if Application.Terminated then
TerminateProcess(ProcessInfo.hProcess, 0);
end;
GetExitCodeProcess(ProcessInfo.hProcess, exitc);
result := (exitc = 0);
if HideApplication then
begin
ShowWindow(Application.Handle, SW_SHOW);
Application.Restore;
Application.BringToFront;
end;
end;
end;
procedure SetEnabled(en: boolean);
var
i: integer;
begin
for i := 0 to Form1.ComponentCount - 1 do
if Form1.Components[i] is TControl then
(Form1.Components[i] as TControl).Enabled := en;
end;
begin
SetEnabled(false);
if not ExecuteAndWait("d:\UserData\Programs\Total Commander\Utilites\EmEditor\EmEditor.exe", False) then
ShowMessage("Возникли какие-то проблемы");
SetEnabled(true);
end;
Поидее вот ещё код, который вроде бы идеально подходит под мою задачу:
http://delphiworld.narod.ru/base/run_wait_many_time.html
но тоже падает на CreateProcess
← →
junglecat (2014-07-24 20:05) [3]создай локальную переменную, копию FileName, и передавай ее
var szFileName: char[0..MAX_PATH];
lstrcpy(szFileName, PChar(FileName));
← →
SchoolBase (2014-07-24 20:18) [4]Спасибо, ошибка пропала. А почему она возникала?
И подскажите пожалуйста, по ссылке на delphiworld приводится такой кусок кода:if ExecAndWait(CommandStr, WaitTime) = WAIT_FAILED then
В каких единицах происходит измерение? Пробовал прописать 1 или 10 вместо WaitTime, но ничего не происходило
← →
junglecat (2014-07-24 20:27) [5]WaitForSingleObject хочет миллисекунды
← →
SchoolBase (2014-07-24 20:57) [6]Понятно, но всё равно не срабатывает событие...
← →
junglecat (2014-07-25 13:37) [7]if WaitForSingleObject(pi.hProcess, WaitTimeOut) = WAIT_TIMEOUT then
ShowMessage("Истекло время ожидания внешней программы " + CommandStr);
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2016.02.14;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c