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

Вниз

Как из экзешника запустить батник?   Найти похожие ветки 

 
Сатир   (2007-06-16 12:45) [0]

сабж.
Что лучше CreateProcess или ShellExecute?
Если несложно, приведите, плиз, пример с параметрами, например для запуска 1.bat
Заранее благодарен


 
Сатир   (2007-06-16 12:58) [1]

Вот нашёл, но что-то сильно громоздко
Procedure RunAndStdoutToStrings(CommandLine: string; Str: TStrings);
var
 tRead, cWrite, dwAvail: cardinal;
 SA: TSecurityAttributes;
 PI: TProcessInformation;
 SI: TStartupInfo;
 sBuff: THandleStream;
 StringBuf: TStringList;
 ret : Cardinal;
 m : TMemoryStream;
 fla : boolean;
begin
 //Инициализация
 SA.nLength:=SizeOf(SECURITY_ATTRIBUTES);
 SA.bInheritHandle:=True;
 SA.lpSecurityDescriptor:=nil;
 if not CreatePipe(tRead, cWrite, @SA, 0) then Exit;
 ZeroMemory(@SI, SizeOf(TStartupInfo));
 SI.cb:=SizeOf(TStartupInfo);
 SI.dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
 SI.wShowWindow:=SW_HIDE;
 SI.hStdOutput:=cWrite;
 //Стартуем процесс...
 if CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, nil, SI, PI)
 then begin
     Str.Clear();
     sBuff := THandleStream.Create(tRead);
     StringBuf := TStringList.Create();
     m := TMemoryStream.Create;
     repeat
       //Ждем N-дцать минут
       Ret := WaitForSingleObject(PI.hProcess, 100);
       StringBuf.Clear();
       if sBuff.Size > 0 then
       begin
         fla := (m.Size > 0) and not (PByteArray(m.Memory)^[m.Size - 1] in [13, 10]);
         m.Size := 0;
         m.LoadFromStream(sBuff);
         m.Position := 0;
         StringBuf.LoadFromStream(m); //Помещаем блок в буфер
         if StringBuf.Count > 0 then
         begin
           //Склеиваем разорванную строку
           if (Str.Count > 0) and fla then
           begin
             StringBuf.Strings[0] := Str.Strings[Str.Count-1]+StringBuf.Strings[0];
             Str.Delete(Str.Count-1);
           end;
         end;
         //Добавляем блок из буфера
         Str.AddStrings(StringBuf);
       end;
       //не пуст ли pipe ?
       //PeekNamedPipe(tRead, nil, 0, nil, @dwAvail, nil);
     until (Ret <> WAIT_TIMEOUT);
     m.Free;
     CloseHandle(PI.hProcess);
     CloseHandle(PI.hThread);
 end;       // if CreateProcess
 CloseHandle(tRead);
 CloseHandle(cWrite);
end;


 
Anatoly Podgoretsky ©   (2007-06-16 13:03) [2]

> Сатир  (16.06.2007 12:58:01)  [1]

Работает?


 
Сатир   (2007-06-16 13:06) [3]


> Работает?
>

ну, я не всё взял, только до If CreateProcess и вместо CommandLine подставил "1.bat" , но вроде не сработало


 
Правильный Вася   (2007-06-16 13:10) [4]

winexec


 
Сатир   (2007-06-16 13:11) [5]


> но вроде не сработало

нужно было указать полный путь к батнику
теперь работает


 
Правильный Вася   (2007-06-16 13:11) [6]

не забудь в комендной строке cmd.exe /P


 
Германн ©   (2007-06-16 13:13) [7]


> ну, я не всё взял, только до If CreateProcess и вместо CommandLine
> подставил "1.bat" , но вроде не сработало
>

А что мешает воспользоваться местным ЧАВО? И найти там более простой пример использования CreateProcess?


 
Gero ©   (2007-06-16 13:17) [8]

ShellExecute



Страницы: 1 вся ветка

Текущий архив: 2007.07.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
15-1182165213
ILUT
2007-06-18 15:13
2007.07.15
Задать положение компонента


3-1176564369
Grec
2007-04-14 19:26
2007.07.15
Столбец для ввода значений


15-1182185504
Грициан
2007-06-18 20:51
2007.07.15
Как вам расширение такое Delphi?


15-1181022997
Суслик
2007-06-05 09:56
2007.07.15
Delphi 2007 update 1


15-1181579172
Тохер
2007-06-11 20:26
2007.07.15
Возможно ли определить четкость фото?