Newsgroup: it.comp.lang.delphi
Titolo: Comando dos

Ciao ragazzi.
Il mio problema č che vorrei effettuare, da un'applicazione Delphi
ovviamente, l'operazione di ping. Avevo pensato di creare un file bat e poi
di mandarlo in esecuzione, ma cosě facendo non riesco a capire se il ping č
andato a buon fine oppure no.
Qualcuno potrebbe darmi dei suggerimenti?
Ciao e grazie.
p.s. ho provato anche ad usare il componente Echo, ma vorrei evitare di
usare componenti.

 di usare componenti.
Come mai, se č lecito? IMHO č *molto* piů pulito usare un componente
(sul quale hai anche un controllo completo) che chiamare un programma
console...
--
Jax
PS: Tra parentesi, credo che sia l'unica soluzione

 Ciao e grazie.
di nulla.
Ciao
Linus
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


speriamo di no. :)
Ciao

 speriamo di no. :)
In effetti non lo è, lo dicevo per ridirigerti sulla retta via ;)))
Comunque, una soluzione potrebbe essere quella di far partire il comando
usando una >
ping 172.24.0.2 > pippo.txt
attendere (con un metodo che non ricordo, ma se cerchi su questo group
dovresti trovarlo) che il ping finisca, e poi leggere il file pippo.txt.
--
Jax

 dovresti trovarlo) che il ping finisca, e poi leggere il file pippo.txt.
Non ti sembra piu semplice e veloce il metodo che ho postato prima????
Non dico che il tuo non sia giusto ma, se puoi fare la stessa cosa piu
velocemente....


 velocemente....
Forse mi sfugge qualcosa O__o
A parte che come velocità dovrebbe essere identico bat o non bat, ma il
tuo problema non era che non riuscivi a sapere se era andato a buon fine
o no? Recuperando l'output, perlomeno hai un riscontro.
Se vuoi usare altre strade, ti consiglio di andare su
http://www.marcocantu.it/ita/newsgroup.htm
e iscriverti al newsgroup Libero. Da qui potrai andare nel gruppo
libero.mrcoke-repository e leggere il messaggio "CreateProcess con
redirezione dello stdout su pipe"
Questo ti dovrebbe permettere (non l'ho mai provato) di chiamare un
processo e catturarne l'output per essere usato dalla tua applicazione.
--
Jax

 o no? Recuperando l'output, perlomeno hai un riscontro.
???? forse si sono confuse le parole; il mio post parlava di una
risoluzione al problema
che era stato posto da AL (non riusciva a sapere se era andato a buon
fine) e in piu
voleva applicare lo stesso modo ad altri comandi DOS.
La velocità era riferita allo scrivere a manina il codice per la
gestione del problema.
Nient'altro.


 voleva applicare lo stesso modo ad altri comandi DOS.
In effetti mentre rispondevo mi chiedevo "metodo che ho postato
prima"...???????? Boh!
Credevo di parlare sempre con al ^__^;;;
Sì, effettivamente come semplicità è meglio il tuo metodo, senz'altro.
Però a me non è che piaccia molto il metodo che ha scelto lui (non s'era
capito eh? :))
--
Jax

 capito eh? :))
Certamente non è molto pulito come metodo e, come hai fatto presente
prima
ci sono tanti altri modi piu puliti. Secondo me tutto dipende anche
dall'uso che si
deve fare della procedura,dal tempo di consegna e dalle necessità del
cliente
,sempre se si tratta di una procedura commerciale, ed in questo caso
sarebbe bene
spendere qualche ora in piu ma riuscire a fornire un prodotto "pulito".
In altri casi ......


var
  tsi: TStartupInfo;
  tpi: TProcessInformation;
  dwRead, dwAvail: DWORD;
  hInputRead, hInputWrite, hDupInputWrite: THandle;
  s: string;
begin
  { sParameter is the parameter you want to pass to net.exe view }
  s := 'ping.exe -n 1' + sParameter;
  if CreatePipe(hInputRead, hInputWrite, nil, 1024) and
     DuplicateHandle(GetCurrentProcess(), hInputWrite, GetCurrentProcess(),
@hDupInputWrite, 0, True,
                     DUPLICATE_CLOSE_SOURCE or DUPLICATE_SAME_ACCESS) then
  begin
    FillChar(tsi, SizeOf(TStartupInfo), 0);
    tsi.cb := SizeOf(TStartupInfo);
    tsi.wShowWindow := SW_HIDE;
    tsi.hStdOutput := hDupInputWrite;
    tsi.hStdError := hDupInputWrite;
    tsi.hStdInput := 0; { You don't need input }
    tsi.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    if CreateProcess(nil, PChar(s), nil, nil, True, 0, nil, nil, tsi, tpi)
then
    begin
      CloseHandle(hDupInputWrite);
      WaitForSingleObject(tpi.hProcess, INFINITE);
      if PeekNamedPipe(hInputRead, nil, 0, nil, @dwAvail, nil) then
      begin
        SetLength(s, dwAvail);
        ReadFile(hInputRead, Pointer(s)^, dwAvail, dwRead, nil);
        {$IFOPT D+} Assert(dwAvail = dwRead); {$ENDIF}
        { s not contains all the text ping.exe spits on the DOS box }
        { so you can check it whether it was successful or not }
      end;
      CloseHandle(tpi.hProcess);
      CloseHandle(tpi.hThread);
    end;
    CloseHandle(hInputRead);
    CloseHandle(hInputWrite);
  end;
end;

Ancora non ho deciso quale metodo adottare, comunque ringrazio tutti, per
l'interessamento e per i suggerimenti.
Ciao
  al

   al
Ciao, Antò.


Grazie Antň,
Ciao ciao