Главная страница
    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.001 c
2-1406382986
tippa
2014-07-26 17:56
2016.02.14
куда уходит память?


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


2-1404906872
Друг
2014-07-09 15:54
2016.02.14
Операция сравнения в дженериках


4-1275893282
apic
2010-06-07 10:48
2016.02.14
Как отследить изменения в определенной ветке реестра?


2-1405621661
sanya_m
2014-07-17 22:27
2016.02.14
Удаление из TADOQuery записей





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский