API - executar programa com CreateProcess

Top  Previous  Next

//A Microsoft aconselha a usar CreateProcess ao invés de WinExec

//--------------------------------------------------------------

// Funcao para executar um programa DOS e aguardar ate que o mesmo termine (testado em Win2000 server, Win98SE e WinXP)

// exemplo: if WinExecWait('c:\market\super', 'c:\market\super\arj.exe', 'a a c:\teste.arj c:\frente\*.exe > c:\log.txt' {a c:\Teste c:\Frente\*.* -r -x*.DBF'}, SW_SHOWMINIMIZED) then

function ExecDOSWait(const WorkDir, ExecutableFile: string; Params: string = ''; WindowStyle: LongWord = SW_SHOWNORMAL): Boolean;

var

  p      : TProcessInformation;

  s      : TStartupInfo;

  R      : Cardinal;

  PParams: PChar;

  RetVar : boolean;

  CDir   : string;

  w98str : string;

begin

   CDir          := GetCurrentDir;

   s.cb          := SizeOf(TStartupInfo);

   s.wShowWindow := WindowStyle;

   s.lpDesktop   := nil;

   s.dwFlags     := STARTF_USESHOWWINDOW;

   s.lpReserved  := nil;

   s.lpTitle     := nil;

   s.cbReserved2 := 0;

   s.lpReserved2 := nil;

 

   if Trim(WorkDir) <> '' then SetCurrentDir(WorkDir);

 

   // para Windows9x

   if Win32Platform <> VER_PLATFORM_WIN32_NT then

   begin

     w98str := 'c:\command.com /c ' + ExecutableFile + #32 + StrTran(Params,'|','');

     if not CreateProcess(nil, PChar(w98str), nil, nil, false,

                          Create_New_Console or Normal_Priority_Class, nil, Pchar(WorkDir), s, p) then Result:= False

     else

     begin

       WaitForSingleObject(P.hProcess,INFINITE);

       GetExitCodeProcess(P.hProcess,R);

       Result := True;

     end;

     Exit;

   end;

 

   if trim(Params) = '' then

      PParams := nil

   else

   begin

      if Params[1] <> ' ' then Params := ' ' + Params;

      PParams := PChar(Params);

   end;

 

   if CreateProcess(PChar(ExecutableFile),PParams,nil,nil,true,0,nil,nil,s,p) then

   begin

     WaitForSingleObject(p.hProcess,INFINITE);

     CloseHandle(p.hProcess);

     CloseHandle(p.hThread);

     RetVar := true;

   end

   else

      RetVar := false;

 

   Result := Retvar;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  if WinExecWait('c:\market\super''c:\market\super\arj.exe''a a c:\teste.arj c:\frente\*.exe > c:\log.txt' {a c:\Teste c:\Frente\*.* -r -x*.DBF'}, SW_SHOWMINIMIZED) then

    Color := clGReen

  else

    Color := clRed;

end;

 

////////////// antigos:

 

 

 

 

 

// Funcao para executar um programa DOS e aguardar ate que o mesmo termine

// Que merda

function ExecDOSWait(const Parametros: string; WorkPath: string = ''; ShowWindow: Word = SW_HIDE): Integer;

var

  R          : DWORD;

  StartUpInfo: TStartUpInfo;

  ProcessInfo: TProcessInformation;

begin

  FillChar(StartUpInfo,SizeOf(StartUpInfo),#0);

  StartUpInfo.Cb      := SizeOf(StartUpInfo);

  StartUpInfo.DwFlags := StartF_UsesHowWindow;

  //StartUpInfo.wShowWindow:= SW_SHOWNORMAL; // Mostra tela do DOS

  StartUpInfo.wShowWindow := ShowWindow; // Oculta a tela do DOS

  if not CreateProcess(nil, PChar(Parametros), nil, nil, false,

                       Create_New_Console or Normal_Priority_Class, nil, Pchar(WorkPath), StartUpInfo, ProcessInfo) then Result:= -1

  else

  begin

    WaitForSingleObject(ProcessInfo.hProcess,INFINITE);

    GetExitCodeProcess(ProcessInfo.hProcess,R);

    Result := R;

  end;

end;

 

////////////////////////// ORIGINAL ///////////////////////

 

// Executa um programa

function WinExec32(const Linha_de_Comando: string; Parametros: string = ''): Boolean;

var

  StartUpInfo: TStartUpInfo;

  ProcessInfo: TProcessInformation;

begin

  FillChar(StartUpInfo,SizeOf(StartUpInfo),#0);

  StartUpInfo.Cb         := SizeOf(StartUpInfo);

  StartUpInfo.DwFlags    := StartF_UsesHowWindow;

  StartUpInfo.wShowWindow:= SW_SHOWNORMAL;

  Result := CreateProcess(PChar(Linha_de_Comando), PChar(Parametros), nil, nil, False,

                          Create_New_Console or Normal_Priority_Class, nil, nil, StartUpInfo, ProcessInfo);

end;

 

// Executa um programa e espera ele terminar

function WinExecAndWait32(const Linha_de_Comando: string; Parametros: string = ''): Integer;

var

  R          : DWORD;

  StartUpInfo: TStartUpInfo;

  ProcessInfo: TProcessInformation;

begin

  FillChar(StartUpInfo,SizeOf(StartUpInfo),#0);

  StartUpInfo.Cb         := SizeOf(StartUpInfo);

  StartUpInfo.DwFlags    := StartF_UsesHowWindow;

  StartUpInfo.wShowWindow:= SW_SHOWNORMAL;

  if not CreateProcess(PChar(Linha_de_Comando), PChar(Parametros), nil, nil, false,

                       Create_New_Console or Normal_Priority_Class, nil, nil, StartUpInfo, ProcessInfo) then Result:= -1

  else

  begin

    WaitForSingleObject(ProcessInfo.hProcess,INFINITE);

    GetExitCodeProcess(ProcessInfo.hProcess,R);

    Result := R;

  end;

end;