Newsgroup: it.comp.lang.visual-basic
Titolo: Quali programmi stanno girando?

Qualcuno sa suggerirmi una routine semplice in grado di  determinare
il nome dei programmi che stanno girando sul PC in un certo momento?
Una routine di questo tipo sarebbe utile sia per impedire il doppio
lancio di uno stesso programma, sia per gestire altre situazioni.
Grazie William

 wrote in message
j9mc6.3947$L94....@twister2.tin.it...

Vai al sito 
http://www.marcominerva.com/vbcorner/api3.htm
e cerca           TaskList.zip

 wrote in message
j9mc6.3947$L94....@twister2.tin.it...

Se vuoi la lista dei programmi, usa FindWindow (API),
ma se il programma č tuo, devi usare App.PrevInstance
Ciao
Sir Jo

 e cerca           TaskList.zip
Attenzione che le funzioni ToolHelp utilizzate nell'esempio non sono
disponibili sotto NT (in Win2k si), ed in questo caso e' necessario
leggere i dati dal registro o utilizzare le funzioni Performance Data
Helper.
Ciao.



Dai un'occhiata sul Sito Comune
Ciao,
Moreno
#sirri#@#morenosoft#.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.morenosoft.com/MSVBSite/
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------

ma se il programma è tuo, devi usare App.PrevInstance
Solo se e' lanciato 2 volte dalla stessa directory :|
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 Opel/ECC Calibrezio EVO-IV --- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD

 Solo se e' lanciato 2 volte dalla stessa directory :|
Scusami, ma questa cosa mi incuriosisce. Il tuo programma e' installato
piu' volte su una macchina in percorsi diversi? Magari e' una cosa
semplicissima e ovvia ma, sara' il superlavoro, non riesco a capire come
tu
possa lanciare il programma da due directory differenti.
Ciao.

tu possa lanciare il programma da due directory differenti.
Numerose possibilita':
- prove tanto per provare
- copia per qualsiasi motivo della directory di installazione --una
volta installati e registrati i componenti, puoi lanciare l'eseguibile
da qualsiasi directory che funziona
- siccome il programma e' in fase di sviluppo, durante l'installazione
creo una directory con nome dipendente dalla versione --perche' adesso
preferisco fare cosi'-- e quindi puoi avere n copie dell'eseguibile
relativamente simili in giro per il disco
- l'utente puo' essere cosi' masochista da installare piu' volte un
programma
- al momento, non ho incluso la possibilita' di impostare la directory
archivio, quindi se vuoi lavorare su 2 archivi ti servono 2 copie del
programma --improbabile voler lavorare su 2 archivi, ma tant'e'...--.
E' una stupidaggine, ma proprio perche' veloce da implementare la sto
rimandando sempre =)
- boh, forse ce ne sono altre...
Comunque, indipendentemente dal motivo per cui uno puo' lanciare
l'eseguibile da varie directories, devo essere sicuro di inibire
questa cosa, da cui sta venendo fuori tutta 'sta menata per evitare
che succeda.


 Numerose possibilita':
[cut]
Ok.
Dato che devi anche utilizzare un qualche metodo di IPC (interprocess
communication) per fare "parlare" le varie istanze dell'applicazionet,
ti voglio suggerire come risolvere il problema in maniera
*SEMPLICISSIMA* prendendo pure due piccioni con una fava.
All'avvio dell'applicazione (Sub Main o Form_Load della Form di avvio)
crei una MailSlot. Questa, oltre a fornirti un valido e veloce metodo di
comunicazione fra processi, ha una particolarita' che fa proprio al caso
tuo: *NON* e' possibile creare una seconda MailSlot che abbia lo stesso
nome di una gia' esistente.
In questa maniera se la chiamata alla funzione CreateMailslot ti
restituisce l'errore ERROR_ALREADY_EXISTS sarai certamente sicuro che
sia' gia' attiva un'altra istanza della tua applicazione, anche se
lanciata da directory differenti, e pure in caso il file exe venisse
rinominato. Una volta appurata l'esistenza di un' istanza gia' attiva,
quella nuova non dovra' fare altro che utilizzare la MailSlot per
comunicare con la prima.
Sotto un semplice esempio:
Private Const INVALID_HANDLE_VALUE = -1
Private Const ERROR_ALREADY_EXISTS = 183&
Private Declare Function CreateMailslot Lib "kernel32" Alias
"CreateMailslotA" (ByVal lpName As String, ByVal nMaxMessageSize As
Long, ByVal lReadTimeout As Long, ByVal lpSecurityAttributes As Long) As
Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
Long) As Long
Private m_hMSlot As Long
Private Sub Form_Load()
    m_hMSlot = CreateMailslot(\\.\mailslot\NomeCheVuoiTu, 0&, 0&, 0&)
    If (m_hMSlot = INVALID_HANDLE_VALUE And Err.LastDllError =
ERROR_ALREADY_EXISTS) Then Call MsgBox("Applicazione già attiva")
End Sub
Private Sub Form_Unload(Cancel As Integer)
    If (m_hMSlot <> INVALID_HANDLE_VALUE) Then Call
CloseHandle(m_hMSlot)
End Sub
Ciao.

    m_hMSlot = CreateMailslot(\\.\mailslot\NomeCheVuoiTu, 0&, 0&, 0&)
Curioso il \\.\.mailslot\*
Esempio *assolutamente* chiaro.
Ora devo preoccuparmi di vedere come si spedisce la roba via mailslot
da un'applicazione all'altra e sono a posto. Ci provo da solo e al
limite di facchio un fischio se non riesco.
Saluti che ho gia' comprato il fischietto :)


 da un'applicazione all'altra e sono a posto.
Sono visti dall'applicazione esattamente come file.
Scriverai su una mailslot utilizzando la CreateFile per recuperarne
l'handle, la WriteFile per scriverci cio' che vuoi ed infine la
CloseHandle per rilasciare l'handle.
Leggerai i messaggi utilizzando ReadFile.
Importante:
Solo il processo che ha creato la mailslot puo' leggerla, mentre
qualunque applicazione che ne conosca il nome puo' scriverci, anche se
essa si trova su computer differenti (in rete ovviamente).
Nello scrivere su una mailslot e' obbligatorio utilizzare il parametro
FILE_SHARE_READ nella CreateFile. Ovvero la mailslot non potra' essere
aperta in scrittura da piu' di un processo contemporaneamente.
La mailslot verra distrutta quando *TUTTI* i processi che ne hanno
ottenuto l'handle avranno chiamato la CloseHandle.
Comunque su MSDN la documentazione e' molto chiara e completa.
Ciao.

Comunque su MSDN la documentazione e' molto chiara e completa.
Perfetto. Per ora ti ringrazio. Eventualmente, mi faccio risentire
sull'argomento.
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro RomagnoloŽ, diffidate dalle imitazioni!
