Newsgroup: it.comp.lang.visual-basic
Titolo: Domanda sull'istr. Shell

Ciao a tutto il NS.
Qualcuno sa dirmi come posso chiudere da codice un programma aperto con
l'istr. Shell?
O in modo più specifico al caso mio, come posso chiudere Outlook dopo averlo
aperto con l'istr. shell?
(tutti i suggerimenti saranno ben accetti).
Mille grazie a tutti.
Ciao Luciano.

 O in modo piů specifico al caso mio, come posso chiudere Outlook dopo



Prova a dare un'occhiata al progetto ProcessVW.zip  presente sul Sito
Comune.
http://www.murialdo.it/it_lang_vb
Ciao
By -MES-   Maronese Ettore
http://www.maronese.com/mes
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb

Non si dovrebbe chiudere un'applicazione brutalmente dall'esterno, ma per
questo ci sono le funzioni ExitProcess e ExiThread. Il problema è che Shell
non ritorna un processId e non so cosa sia l'handle che ritorna (un
threadid?). In ogni caso, queste funzioni chiudono l'applicazione come lo
può fare il task manager, cioè senza dare loro chance (quindi rimane roba in
memoria etc.).
----------------------------------------------------------------------
Stefano Minardi
zet...@mclink.it
----------------------------------------------------------------------

 threadid?).
Sembrerebbe, invece, che Shell ritorni proprio un process id: e' da diverso
tempo che questa questione mi affligge ma non ho ancora approfondito perche'
speravo di trovare, prima o poi, una risposta in uno dei tanti post
sull'argomento. Vediamo se questa volta, insieme, riusciamo a venirne fuori.
Parto dalla guida di VB (4) che dice:
"Funzione Shell
[...]
Osservazioni
Se la funzione Shell esegue in modo corretto il programma indicato,
restituirà l'identificativo (ID) di processo del programma avviato. L'ID di
processo è un numero univoco, che identifica il programma in esecuzione. Se
la funzione Shell non riesce ad avviare il programma specificato, verrà
generato un errore."
"La funzione Shell non consente l'esecuzione di documenti con applicazioni
associate (Leggimi)
[Viene illustrato l'uso di ShellExecute]
Si noti, inoltre, che la funzione Shell restituisce un valore di tipo Long.
Nell'argomento della Guida questa informazione non viene fornita."
Se, pero', eseguo il "Visualizzatore oggetti" con:
Librerie/Progetti: VBA - Visual Basic For Application
Classi/Moduli: Interaction
Metodi/Proprieta': Shell
si legge:
Shell(PathName As Variant; [WindowStyle As Variant]) As Double
Runs an executable program
Double!?
D. Appleman, in "Visual Basic Programmer's Guide to the Win32 API",
"Launch.vbp: Launching Applications" dice:
"One of the easiest ways to launch an application is to use the Visual Basic
Shell command. Under Win32, this function returns the process identifier of
the new process. If the application is shelled successfully, it then calls
the first of our synchronizing functions: WaitForTerm1.
The WaitForTerm1 example takes a process identifier as its parameter. The
process identifier is unique throughout the system, but cannot be used
directly by the wait functions because it is not itself an object. The
OpenProcess function obtains an actual process handle to the newly created
process. This function can fail on NT systems which have increased security
in place, but will work in most cases."
Quindi il problema e' con NT: di che problema si tratta?
Io ho testato in Win95 e Win98 e non ho avuto problemi. Un esempio l'ho
postato qualche giorno fa (1/3) appeso al filozzo dal significativo oggetto:
"[???] Ma non lo sa nessuno?!".
--
Ciao.
Maurizio

Quindi il problema e' con NT: di che problema si tratta?
Con NT può esserci un problema di privilegi (difficilmente se l'applicazione
l'hai lanciata tu stesso con shell). Ovvero: per accedere con OpenProcess al
processo potrebbero essere necessari privilegi superiori a quelli ottenuti
dall'applicazione che lo vuole aprire. Siccome il processo lo esegue il tuo
stesso programma, questo non dovrebbe capitare. In caso diverso si dovrebbe
impersonare l'utente che ha i privilegi adeguati (un discreto macello).
Mi è invece sfuggito il thread (inteso come relativo al NG): la questione
era anche se si può o meno eseguire un TerminateProcess dopo una Shell? In
ogni caso, dato che Shell torna un processid, si può con:
dim sid as long, pid as long
sid = Shell("c:\windows\notepad.exe")
....
pid = OpenProcess(PROCESS_TERMINATE, 0, sid)
TerminateProcess pid, 0
CloseHandle pid
