Newsgroup: it.comp.lang.delphi
Titolo: ShellExecute su XP e su Win2000/W98 (completo)

.. scusate ma è partito il messaggio mentre facevo copia/incolla.
Ricomincio da capo.
Salve a tutti
al termine di un processo devo eseguire uno script FTP
Il comando che utilizzo, e che *funziona* su WinXP SP1 è il seguente:
 ShellExecute(Handle, 'open', 'FTP.exe', '-s:c:\ftpscript.txt', nil, SW_SHOWNORMAL);
il problema è che con Win2000 e Win98SE invece di eseguire il programma FTP.EXE
apre Internet Expoler e cerca di aprire l'url   
ftp://FTP.EXE
Qualcuno ha qualche idea ?
Grazie
GP

 Qualcuno ha qualche idea ?
ma ftp.exe esiste sugli altri SO ?
hai provato a copiarlo nella directory del tuo prg?
-- 
Morde. 
ICLDweb: 
http://www2.samatel.com/icld/

 Morde.
Si, ftp.exe esiste ed è nella path di ricerca al primo posto C:\WINDOWS\SYSTEM32
Infatti eseguendo a mano il comando
            FTP -s:c:\ftpscript.txt
tutto va a meraviglia.
Il problema è nella ShellExecute che tenta di far eseguire l'exe
ma IE lo cattura (come se fosse una url tipo 
http://xxx.yyyy.it
) e
li si blocca
            ShellExecute(Handle, 'open', 'FTP.exe', '-s:c:\ftpscript.txt', nil, SW_SHOWNORMAL);
Peraltro, adesso, scrivendo la riga FTP ecc. ecc.., OutlookExpress "cattura" la parola    FTP.exe
mentre la scrivo e gli assegna automaticamente un'url = 
ftp://ftp.exe
 (qui sono con XP e IE 6).
Mah?
GP

Rinomina il file FTP.EXE e chiama quello rinominato.
Se non dico cazz...te con uno dei service pack (non ricordo quale) se 
shellexecute incontra una dicitura ftp o http o mms etc... chiama il 
browser corrispondente al protocollo

 ha scritto nel messaggio news:dkfuvd$4jd$1...@newsreader.mailgate.org...

Grazie !
stanno usando Win2000pro SP4 e Win98SE
Stavo pensando anch'io proprio la stessa cosa.
Ci proverò lunedi dal cliente e vi farò sapere.
Certo che è veramente assurdo....
GP

> Qualcuno ha qualche idea ?
Potresti crearti un file .bat al volo coi comandi e successivamente con 
la ShellExecute chiamare il file .bat
Diego.
--- posted by geoForum on 
http://www.delphiedintorni.it

 Diego.
Ciao Diego
anche questa č una buona idea....  :-)
grazie
GP

Al di la' che mancano i vari PChar davanti alle string, non facoltativi, 
proverei cosi' dal momento che lanci direttamente un eseguibile:
ShellExecute(Handle, Nil, PChar('C:\TuaPath\FTP.exe'), 
PChar('-s:c:\ftpscript.txt'), PChar(''), SW_SHOWNORMAL);
dove  C:\Path e' la cartella del file, se e' la "system" puoi ottenerla con 
le apposite funzioni.
Ciao, Giorgio
"G.P." <@> ha scritto nel messaggio 
news:I%Kaf.45425$Pe2.8...@twister2.libero.it...


 PChar('-s:c:\ftpscript.txt'), PChar(''), SW_SHOWNORMAL);
Un metodo che sicuramente funziona č quello di passare dalla shell:
ShellExecute(0, nil, 'cmd.exe', '/c fpt.exe -s:c:\ftpscript.txt', '', 
SW_SHOWNORMAL);


Ciao Giorgio
il problema riguarda l'esecuzione sotto Win98 e Win2000,
invece con WinXP è tutto ok, il programma viene trovato ed eseguito lo script.
Il problema sembrerebbe risiedere  nel SP4 Win2000 che
in qualche modo modifica il registro ed anzichè far eseguire l'exe richiesto
fa aprire, di sua iniziativa, il browser e cerca l'url ftp.exe
I PChar non c'entrano niente, come pure la path che è a posto.
Grazie lo stesso
GP



Prova con questa, alternativa alla ShellExecute. In filename ci metti l'eseguibile seguito dai parametri.
Se DoWait e' true la chiamante attende la chiusura del processo, altrimenti no.
 
Giorgio
 
 
function CreateProcAndWait(FileName: String; Visibility, doWait: Boolean): TProcessInformation;
// -1 se fallisce altrimenti restit. il TProcessInformation
var dwExitCode: DWord; StartupInfo: TStartupInfo;
begin
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
FillChar(Result, Sizeof(Result), #0);
With StartupInfo do
begin
cb:=Sizeof(StartupInfo);
dwX:=400; dwY:=0;
dwXSize:=200; dwYSize:=200;
dwFlags:=STARTF_USESHOWWINDOW Or STARTF_USEPOSITION Or STARTF_USESIZE
Or STARTF_FORCEONFEEDBACK;
if Visibility then
    wShowWindow:=SW_SHOW
else
    wShowWindow:=SW_HIDE;
end;
if not CreateProcess(
nil, { pointer to command line string }
PChar(FileName), //lpCommandLine,
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes}
False, { handle inheritance flag }
//CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block}
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
Result) { pointer to PROCESS_INFORMATION } then
    Result.hProcess:= -1 {ERRORE!!! pointer to PROCESS_INF }
else
if doWait then
begin
// Attende che l'applic. venga chiusa
WaitForInputIdle(Result.hProcess, INFINITE);
WaitforSingleObject(Result.hProcess, INFINITE);
GetExitCodeProcess(Result.hProcess, dwExitCode);
CloseHandle(Result.hProcess);
CloseHandle(Result.hThread);
end;
end;