Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1406532286
Dmitry
2014-07-28 11:24
2016.02.14
Как в QuickReport открить отчет для просмта сразу в Preview


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


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


2-1406215639
SchoolBase
2014-07-24 19:27
2016.02.14
Запустить другую программу и дождаться завершения(или таймер)


15-1433584118
pavelnk
2015-06-06 12:48
2016.02.14
Событие onShow





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский