Newsgroup: it.comp.appl.access
Titolo: CHIUSURA DI UN ESEGUIBILE

HO UN PROGRAMMA INSTALLATO SU C:\CARTELLA\PROG.EXE, vorrei poterlo
chiudere con un apposito pulsante da codice.
Ho già provato con KILL, KILL -F, ma non funziona.
Come posso fare?
Grazie

 wrote in message
news:487a3fde.04101...@posting.google.com

Usa la Sub sotto in questo modo:
Call Killprocess("PROG.EXE")
'Killare un processo
Private Sub KillProcess(strName as string)
    Dim obj As Object
    For Each obj In GetObject("winmgmts:").ExecQuery("SELECT * FROM
Win32_Process WHERE Name='calc.exe'")
        If obj.Name = strname then obj.Terminate
    Next
End Sub
Ciao
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


e in windows98 come diventa il tuo codice? 

...

Ho prvato con questa soluzione, ma non funziona. Il risultato è che
l'applicativo rimane aperto, non viene chiuso.

...

Trovato l'errore. al posto di strname ho messo direttamente
"eseguibile.exe" e cosě funziona (era logico visto che non abbiamo
assegnato la variabile da nessuna parte!). Scusa se sono stata
precipitosa.
Invece mi servirebbe un chiarimento: ok quando l'eseguibile č aperto
sulla mia macchina, ma quando devo chiudere un applicativo che č
aperto su una maccina collegata in rete come posso fare?
Grazie

 Grazie
Con WMI puoi fare tutto, la cosa è un pò più complessa ma
dovrebbe bastare accedere tramite IMPERSONATE alla Macchina
sulla quale devi CHIUDERE e farlo...!
Purtroppo ora non ho sotto mano la Documentazione necessaria
ma se guardi le Classi di WMI della piattaforma SDK su MSDN
dovresti trovare sufficienti delucidazioni.
Dovresti trovare una cosa simile che dovrebbe Funzionare(Forse):
Public Function KillRemote(strCompName as string, strName as string)
   Dim objItem as object
   Dim objWMIService as object
   Set objWMIService = GetObject("winmgmts:" _
   & "{impersonationLevel=impersonate}!\\" & strCompName &
"\root\cimv2")
   For Each objItem In objWMIService.ExecQuery("SELECT * FROM
Win32_Process ")
     If objItem.name=strName then
        objItem.Terminate
        Exit For
   Next
End Function
Ciao
@Alex.


 @Alex.
Ho letto e ho provato, ma su questo codice mi segnala un errore di
automazione (chiaramanete sulla riga in cui c'č il Set).

 automazione (chiaramanete sulla riga in cui c'è il Set).
Si non l'ho provata ho fatto un collage di quanto riportato
in MSDN, devi costruire correttamente la Stringa d'accesso
ai Servizi della macchina.
Vedi questo link
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/constructing_a_moniker_string.asp


...

Ho sistemato il codice (avevo sbagliato io con la dicitura
"\root\cimv2") e ora non mi genera piů l'errore di automazione, ora
l'errore č il seguente:
ERRORE DI RUN-TIME '462' - Il computer server remoto non esiste o non
č disponibile.
Ho cercato la documentazione sul sito della Microsoft, ma non ho
trovato nulla di specifico per la mia problematica.
Chiedo troppo poter avere qualche altra delucidazione sul codice sopra
riportato?

 riportato?
Sinceramente la spiegazione delle Classi di WMI è cosa estremamente
articolata e complessa da spiegare, ci sono Testi principalemte 
in Inglese e l'ottimo ma stringato MSDN.
In poche parole Windows ha delle Classi e famiglie di Classi.
Queste espongono proprietà legate all'oggetto Puntato.
Nel tuo caso accedi all'elenco dei Processi sulla macchina LOCALE
con questa Routine e quando intercetti quello passato lo KILLI
For Each objItem In GetObject("winmgmts:").ExecQuery("SELECT * FROM
    Win32_Process ")
      If objItem.name=strName then
         objItem.Terminate
         Exit For
Next
Nel caso di voler accedere ad una Macchina Remota devi istanziare 
un'oggetto associato alla macchina remota, nel quale esegui
la stessa Routine.
Questo lo fa la parte sottoriportata simulando di Lavorare in Locale
con il comando Impersonate....ecc...!!
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strCompName &
    "\root\cimv2")
E' fondamentale la localizzazione dei riferimenti WMI passati
nella stringa per questo ti ho linkato il Sito MS che spiegava
un pò come muoversi....!
Prova a passare l'indizizzo IP invece che il Nome.
P.S. devi essere ADMIN della macchina dalla quale esegui...!
Ciao
@Alex


 @Alex
Devi essere loggata con un account che sia Admin anche del PC remoto, o
quantomeno che ti consenta di chiudere processi su quella macchina, per
esempio lo stesso account usato per avviarli.
Eventuali firewall posti tra i due PC potrebbero bloccare l'accesso ai
servizi del PC remoto, impedendoti di terminare i processi. Se usi XP SP2
hai il firewall attivo di default, verifica le impostazioni.
Namor
-- 
namor at inwind punto it
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

...

Si, in effetti avevo pensato al problema degli accessi con il
firewall. Ora provo il tutto e poi ti faccio sapere.

...

Ho provato. La situazione è questa: gestendo il pc remoto con il
numero di IP, l'errore è che non riesce a trovare il server remoto;
gestendo la connessione con il nome del pc, la risposta è che non sono
autorizzata all'accesso.
Il firewall è disabilitato su entrambi i pc e sono entrato in entrambi
come Admin (settato come amministratore del sistema)

...

Chiedo un'ultimo aiuto:
per terminare il processo l'istruzione è 'Terminate'. Per riaprire
un'eseguibile su una macchina in rete?
Grazie ancora