Newsgroup: it.comp.lang.delphi
Titolo: ShellExecuteEx ... chiarimenti sull'utilizzo ???

//############# Execute and wait 
###############################################
function TForm1.ExecuteAndWait (const Filename:string;const 
Parametri:string='';Wait:Boolean=false):Thandle;
var
SEI: TShellExecuteInfo;
TempoTO: Cardinal;
begin
  TempoTO:=INFINITE;
  FillChar(SEI,SizeOf(SEI), #0);
  SEI.cbSize := SizeOf(SEI);
  if wait then
    SEI.fMask := SEE_MASK_NOCLOSEPROCESS;
    SEI.lpFile := PChar(Filename);
    SEI.nShow := SW_SHOWMINNOACTIVE;
    SEI.lpParameters := PChar(Parametri);
    WaitSetMsg( 'Stand-by ON your decoder and wait ...' ); //
splashscreen
  if ShellExecuteEx(@SEI) then
  begin
      if Wait then
    WaitForSingleObject(SEI.hProcess, TempoTO);
    CloseHandle(SEI.hProcess);
    End ;
  end;
_______________________________________________________________________
______________
//############## Read Languages from decoder 
###################################
procedure TForm1.MSDownloadClick(Sender: TObject);
begin
SetCom; // setta il numero di porta com (procedura)
SetVelocity; // setta la velocità della porta (procedura)
if MessageDlg('You have selected COM '+inttostr(ComPort)+' and 
BaudRate of '+inttostr(ComVelocity)+chr(13)+'                        
Are you shure?',
      mtConfirmation, mbYesNo, 0) = mrYes then
  begin
  CreaFileFlashReader; // estrae file.exe contenuto all'interno 
dell'eseguibile
  ShowMessage('Please connect your decoder to PC');
  ShowMessage('Please to be shure your decoder are into Stand-by 
mode');
  WaitStart(Self,'Please Wait ...' ); // splashscreen
  Sleep(2000); // mi serve per dare descrizioni a riguardo
  ExecuteAndWait ('FReader.exe','"'+inttostr(ComPort)+'" '+' 
"'+IntToStr(ComVelocity)+'"'+' hdfbin-3-010000.raw 3 0x010000 
0x08d6f0',True); // corrisponde all'esecuzione dell'eseguibile dos 
completo di parametri:" FReader.exe 1 115200 hdfbin-3-010000.raw 3 "
  WaitSetMsg( 'Ending ...' ); // splashscreen
  Sleep(2000);
  WaitEnd; // splashscreen end
  end else
showmessage ('Please select COM Port number and BaudRate from "COM 
Settings" Menu');
end;
_______________________________________________________________________
____________________
1° problema, DTS 2006 mi dice warning riguardo la funzione indefinita 
(effettivamente andrebbe migliorata, mi interessa mandare solo COM, 
Velocità e Parametri)
2° problema il tutto è risultato di copia/incolla e ... piccoli 
aggiustamenti da "profano"
3° mi piacerebbe avere più controllo sulla funzione (eventuali errori 
compresi) evitando gli Sleep
insomma se qualcuno mi aiuta a migliorare il tutto benvenga, viceversa 
può essere utile a chi, profano come me, ne avesse bisogno ;)
il tutto funziona ma mi sembra un po troppo rattoppato :(

Vedi se questa è migliore:
Type
   TPriority = (tpBassa, tpNormale, tpAlta, tpRealTime);
// ----------------------------------------------------------------------
// Esegue un programma esterno (anche non .EXE [Esempio .HLP, .BMP, ...])
//
// Programma : Eseguibile
// Params    : Parametri aggiuntivi
// Priorita  : Priorita' di esecuzione
// bWait     : Se deve attendere la fine del programma
//             (bWait non funziona sotto Windows NT/2000)
// ----------------------------------------------------------------------
Function WExec32(Const Programma : String;
                  Const Params    : String;
                        Priorita  : TPriority;
                        bWait     : Boolean) : Boolean;
Var
   lpCmdLine   : Array[0..500] Of Char;
   Priority    : DWord;
   StartupInfo : TStartupInfo;
   ProcessInfo : TProcessInformation;
Begin
   Result := False;
   // ----------------------------------
   // Linea di comando
   // ----------------------------------
   StrPCopy(lpCmdLine, Programma + ' ' + Params);
   // ----------------------------------
   // Settaggio priorita' di esecuzione
   // ----------------------------------
   Case Priorita of
        tpBassa    : Priority := IDLE_PRIORITY_CLASS;
        tpNormale  : Priority := NORMAL_PRIORITY_CLASS;
        tpAlta     : Priority := HIGH_PRIORITY_CLASS;
        tpRealTime : Priority := REALTIME_PRIORITY_CLASS;
        Else
          Priority := NORMAL_PRIORITY_CLASS;
   End;
   // ----------------------------------
   // Azzeramento dati di ritorno
   // ----------------------------------
   FillChar(ProcessInfo, SizeOf(ProcessInfo), 0);
   // -----------------------------------
   // Preparazione dati di Start-Up
   // -----------------------------------
   FillChar(StartupInfo, SizeOf(StartupInfo), #0);
   With StartupInfo Do
        Begin
          cb          := SizeOf(StartupInfo);   // Dimenzione
          dwFlags     := STARTF_USESHOWWINDOW;  // Ignora parametri avanzati
          wShowWindow := SW_SHOWNORMAL;         // Visualizzazione normale
        End;
   // -----------------------------------------------------------
   // Se e' un'applicazione console -> crea una nuova console
   // -----------------------------------------------------------
   Priority := Priority Or CREATE_NEW_CONSOLE;
   // ------------------------------
   // Lancia l'applicazione
   // ------------------------------
   Try
     If Not CreateProcess(nil,         // Nessun modulo
                          lpCmdLine,   // Linea di comando + ' ' + parametri
                          nil,         // No Security Attributes
                          nil,         // No Thread Security Attributes
                          FALSE,       // Nuovo Handle
                          Priority,    // Parametri di Start-Up
                          nil,         // Usa le Enviroment del chiamante
                          nil,         // Nessuna directory di default
                          StartupInfo, // punta alla struttura StartupInfo
                          ProcessInfo) // punta alla struttura ProcessInfo
     Then
       Begin
         Result := (ShellExecute(Application.handle, 'open', lpCmdLine, 
Nil, Nil, SW_SHOW) > 32);
         Exit;
       End;
   Except
     Exit;
   End;
   // ------------------------------------------------
   // Se con attesa -> attende la fine del processo
   // (ATT: Non funziona sotto Windows NT/2000)
   // ------------------------------------------------
   If bWait Then WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
   Result := True;
End;

grazie la studierò
ps. che significa che non funziona sotto NT/2000 ?
ti riferisci solo al "   If bWait Then 
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);  " ???

Si solo all'attesa. Sotto 2000 o XP a volte non si riesce ad 
intercettare la chiusura del processo (perchè poi vallo a capire)