Lovely!  Thanks, Jeff
-Rich

Jeff Young wrote

> Rich,
> Thought I'd chime in with code that I've used for the very same
> process. It worked on D7... HTH.
> 
> 
> unit Process;
> 
> interface
> 
> uses
> Classes, Windows, SysUtils;
> 
> function ExecuteWait(Path, Command, Params: String; ShowWindow: Word;
> Output: TStringList): DWord;
> function GetTempFile: String;
> 
> implementation
> 
> function ExecuteWait(Path, Command, Params: String; ShowWindow: Word;
> Output: TStringList): DWord;
> // Build a temporary filename -----------
> var
>  StartupInfo: TStartupInfo;
>  ProcessInfo: TProcessInformation;
>  saAttr: TSecurityAttributes;
>  hOut, hInp: THandle;
>  outFile, inpFile: String;
> 
> begin
>  if Path = '' then begin
>        Output.Add('Path not specified: ' + Path);
>        exit;
>  end;// if Path
>  saAttr.nLength := sizeof(TSecurityAttributes);
>  saAttr.bInheritHandle := True;
>  saAttr.lpSecurityDescriptor := nil;
>  hOut := STD_OUTPUT_HANDLE;
>  hInp := STD_INPUT_HANDLE;
> 
>  if Output <> nil then begin
>    outFile := GetTempFile;
>    hOut := CreateFile(PChar(outFile),
> 
> GENERIC_READ or GENERIC_WRITE,
>                       0,
>                       @saAttr,
>                       CREATE_ALWAYS,
>                       FILE_ATTRIBUTE_TEMPORARY,
>                       0);
>   end; // if Output <> nil
> 
>  ZeroMemory(@ProcessInfo, SizeOf(TProcessInformation));
>  ZeroMemory(@StartupInfo, SizeOf(TStartupInfo));
> 
>  with StartupInfo do begin
>    cb          := SizeOf(TStartupInfo);
>    hStdOutput  := hOut;
>    hStdError   := hOut;
>    hStdInput   := hInp;
>    wShowWindow := ShowWindow;
>    dwFlags     := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
>  end; // with
> 
>  if CreateProcess(nil,
>  PChar('"'+
> Path + Command + '" ' + Params),
>                   @saAttr,
>                   @saAttr,
>                   True,
>                   0,
>                   nil,
>                   PChar(Path),
>                   StartupInfo,
>                   ProcessInfo) then begin
>    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
>    repeat
>      GetExitCodeProcess(ProcessInfo.hProcess, Result);
>      //Application.ProcessMessages;
>    until (Result <> STILL_ACTIVE);
>    CloseHandle(ProcessInfo.hProcess);
>    CloseHandle(ProcessInfo.hThread);
>    if Output <> nil then begin
>      CloseHandle(hOut);
>      Output.LoadFromFile(outFile);
>     end; // if Output <> nil
>    DeleteFile(inpFile);
>    DeleteFile(outFile);
>   end // if CreateProcess(...
>  else
>    Output.Add('Create Process failed. Code: ' +
>          IntToStr(GetLastError()));
> end; //
> 
> function GetTempFile: String;
> var
>  DirBuf, FileBuf: Array [0..255] of char;
> begin
>  GetTempPath(Length(DirBuf), DirBuf);
>  GetTempFileName(DirBuf, 'tmp', 0, PChar(@FileBuf));
>  Result := FileBuf;
> end;//GetTempFile
> 
> end.
> 
> 
> _______________________________________________
> Delphi mailing list -> Delphi@elists.org
> http://www.elists.org/mailman/listinfo/delphi
>
_______________________________________________
Delphi mailing list -> Delphi@elists.org
http://www.elists.org/mailman/listinfo/delphi

Reply via email to