Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.02.14;
Скачать: CL | DM;

Вниз

Запустить другую программу и дождаться завершения(или таймер)   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.005 c
2-1406382986
tippa
2014-07-26 17:56
2016.02.14
куда уходит память?


2-1406884783
Сергей
2014-08-01 13:19
2016.02.14
Не отображаются кнопка на панели mdi child формы


6-1278956174
Виктор85
2010-07-12 21:36
2016.02.14
Декодирование канонизированного URL


2-1406532286
Dmitry
2014-07-28 11:24
2016.02.14
Как в QuickReport открить отчет для просмта сразу в Preview


15-1433179200
Pavelnk
2015-06-01 20:20
2016.02.14
Вот такая графическая задачка