PDA

View Full Version : [VB6]Collegare processi


4ndr34s
03-12-2008, 19:50
raga è possibile fare in modo che un applicazione si alleghi ad un processo?

variabilepippo
03-12-2008, 20:45
è possibile fare in modo che un applicazione si alleghi ad un processo?


In termini tecnici cosa significa? Chiarisci il senso che dai al verbo "allegare".

4ndr34s
04-12-2008, 06:58
vorrei fare in modo che il mio exe quando veda un processo chiamato gunzlauncher.exe avviato si termini.
è possibile ciò?

MarcoGG
04-12-2008, 11:54
vorrei fare in modo che il mio exe quando veda un processo chiamato gunzlauncher.exe avviato si termini.
è possibile ciò?


Naturalmente. Qui trovi un interessante tutorial con tutto il codice necessario per ottenere una lista dei processi attivi ( come vedrai non è tanto "immediato" :) ).

http://support.microsoft.com/kb/187913

Dalla lista, ad ottenere quello che chiedi direi che il passo è breve... ;)

4ndr34s
04-12-2008, 16:50
ehm per me non è tanto facile dato che sono alle prime armi mi serve il vostro aiuto per fare ciò che vi ho detto

MarcoGG
05-12-2008, 09:42
1. Segui alla lettera quel tutorial, e hai già in mano il 95% della soluzione.

2. Quando hai la Form funzionante, basta che aggiungi alla Form un controllo Timer ( Enabled = True e Interval = 2000 ).

3. A questo punto prendi tutto il codice che era associato al pulsante Command1 e lo copi nella routine del Timer ( Private Sub Timer1_Timer() ).

4. Sempre nella routine Timer, in fondo, prima dell' End Sub aggiungi questo codice :

Dim j As Integer
j = 0
For j = 0 To List1.ListCount - 1
If List1.List(j) = "C:\WINDOWS\system32\gunzlauncher.exe" Then
Unload Me
End If
Next j

Devi specificare anche il percorso del processo che vuoi controllare. ;)
Semplicissimo, no ?

4ndr34s
05-12-2008, 15:11
mmm ma il problema è che se il processo da controllare in questione non stia nella destinazione che dico io cosa succede?

MarcoGG
06-12-2008, 09:37
mmm ma il problema è che se il processo da controllare in questione non stia nella destinazione che dico io cosa succede?


Basta che fai il controllo sul solo nome del processo, con una piccola modifica al codice precedente :
Dim j As Integer
j = 0
Dim processo As String
processo = "gunzlauncher.exe"
For j = 0 To List1.ListCount - 1
Dim nomeProc As String
nomeProc = Right(List1.List(j), Len(processo))
If nomeProc = processo Then
Unload Me
End If
Next j

E adesso hai anche il restante 5% della soluzione... :D

4ndr34s
06-12-2008, 15:40
ma metto questo codice ma non funziona
oppure si puo fare in modo che se si termina theduel.exe si termina anche la mnia applicazione?

MarcoGG
07-12-2008, 09:37
ma metto questo codice ma non funziona


Devi essere meno ermetico. COSA non funziona ?
Comunque questo era il codice Timer che intendevo :

Private Sub Timer1_Timer()

List1.Clear
Select Case getVersion()

Case 1 'Windows 95/98

Dim f As Long, sname As String
Dim hSnap As Long, proc As PROCESSENTRY32
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If hSnap = hNull Then Exit Sub
proc.dwSize = Len(proc)
'Iterate through the processes
f = Process32First(hSnap, proc)
Do While f
sname = StrZToStr(proc.szExeFile)
List1.AddItem sname
f = Process32Next(hSnap, proc)
Loop

Case 2 'Windows NT

Dim cb As Long
Dim cbNeeded As Long
Dim NumElements As Long
Dim ProcessIDs() As Long
Dim cbNeeded2 As Long
Dim NumElements2 As Long
Dim Modules(1 To 200) As Long
Dim lRet As Long
Dim ModuleName As String
Dim nSize As Long
Dim hProcess As Long
Dim i As Long
'Get the array containing the process id's for each process object
cb = 8
cbNeeded = 96
Do While cb <= cbNeeded
cb = cb * 2
ReDim ProcessIDs(cb / 4) As Long
lRet = EnumProcesses(ProcessIDs(1), cb, cbNeeded)
Loop
NumElements = cbNeeded / 4

For i = 1 To NumElements
'Get a handle to the Process
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessIDs(i))
'Got a Process handle
If hProcess <> 0 Then
'Get an array of the module handles for the specified process
lRet = EnumProcessModules(hProcess, Modules(1), 200, cbNeeded2)
'If the Module Array is retrieved, Get the ModuleFileName
If lRet <> 0 Then
ModuleName = Space(MAX_PATH)
nSize = 500
lRet = GetModuleFileNameExA(hProcess, Modules(1), ModuleName, nSize)
List1.AddItem Left(ModuleName, lRet)
End If
End If
'Close the handle to the process
lRet = CloseHandle(hProcess)
Next i

End Select

'Controllo processo :
Dim j As Integer
j = 0
Dim processo As String
processo = "gunzlauncher.exe"
For j = 0 To List1.ListCount - 1
Dim nomeProc As String
nomeProc = Right(List1.List(j), Len(processo))
If nomeProc = processo Then
Unload Me
End
End If
Next j
End Sub

E non ci sono santi che funziona. ;)

4ndr34s
07-12-2008, 13:04
grazie mille ,lo provo subito!!

4ndr34s
07-12-2008, 13:10
mmm da un errore con il getversion()
sub or fuction not definied

MarcoGG
07-12-2008, 14:32
mmm da un errore con il getversion()
sub or fuction not definied


:rolleyes:
Ma il tutorial l'hai seguito ? Hai creato il modulo e ci hai messo tutte le funzioni ?

Cmq, io quel tutorial c'ho messo 5 minuti a farlo, e posso garantire che funziona, almeno per quanto riguarda Win XP.

4ndr34s
07-12-2008, 20:34
non so perchè ma mi da un sacco di errori del tipo ambigous name nonostante tutto abbia messo il modulo come è scritto nella guida non so forse sarà dovuto al fatto che uso + moduli? siccome questo programma mi serve anche per fare un altra operazone c'è anche un altro modulo.
come posso risolvere?

MarcoGG
08-12-2008, 09:26
non so perchè ma mi da un sacco di errori del tipo ambigous name nonostante tutto abbia messo il modulo come è scritto nella guida non so forse sarà dovuto al fatto che uso + moduli? siccome questo programma mi serve anche per fare un altra operazone c'è anche un altro modulo.
come posso risolvere?

Avere più moduli di per sè non è un problema. Ma devi controllare di NON avere nei moduli variabili, sub, function ecc... con lo stesso nome !
Se in Modulo1 hai una Sub "nomeSub", e in Modulo2 una Sub con lo stesso nome non compilerà mai !
Inoltre dichiara sempre le variabili, anche per i semplici contatori di ciclo... ;)

4ndr34s
08-12-2008, 12:52
non so proprio come risolvere potrei postare qui il mio progetto?

4ndr34s
21-02-2009, 15:37
Raga volevo chiedervi: e se io volessi fare il contrario, cioè se non c'è il processo fai questo,altrimenti quest'altro, io ho provato con IF Not ma non va :-S

MarcoGG
23-02-2009, 09:23
Raga volevo chiedervi: e se io volessi fare il contrario, cioè se non c'è il processo fai questo,altrimenti quest'altro, io ho provato con IF Not ma non va :-S

Con IF Not controllerà solo il primo processo della lista e uscirà dall'applicazione. Ovvio che non funziona.
Con una piccola modifica alla routine Controlla Processo precedente...:

'Controllo processo :
Dim j As Integer
j = 0
Dim processo As String
processo = "gunzlauncher.exe"
Dim procTrovato As Boolean
procTrovato = False
For j = 0 To List1.ListCount - 1
Dim nomeProc As String
nomeProc = Right(List1.List(j), Len(processo))
If nomeProc = processo Then
procTrovato = True
Exit For
End If
Next j
If procTrovato = True Then
MsgBox (processo & " trovato.")
Else
MsgBox (processo & " non trovato.")
End If

;)