PDA

View Full Version : [vb6]Processi


4ndr34s
07-01-2009, 06:29
ciao a tutti
raga vorrei fare in modo che la mia applicazione se viene chiusa si deve chiudere anche un altra applicazione , è possibile farlo?se è possibile come posso farlo?

cionci
07-01-2009, 10:11
Certo, nell'evento di chiusura devi usare le API.

Questo chiude direttamente un processo (non è una chiusura safe):
http://www.eggheadcafe.com/community/aspnet/8/20934/kill-process-using-visual.aspx
Questo è un metodo alternativo, guarda quello che ti granatisce più compatibilità:
http://www.andreavb.com/tip020021.html

Questo manda un messaggio equivalente alla chiusura premendo la X dell'interfaccia grafica:
http://www.thescarms.com/vbasic/stopprocess.aspx

MarcoGG
07-01-2009, 14:56
Qui trovi il Tip Of The Day di un certo Francesco Balena, che penso faccia al caso tuo, molto ben commentato :

http://www.devx.com/vb2themax/Tip/19049

;)

4ndr34s
07-01-2009, 15:37
hem c'è scritto che funziona solo su NT e 2000 :-S

MarcoGG
07-01-2009, 16:04
hem c'è scritto che funziona solo su NT e 2000 :-S

Su Vista non garantisco, ma fino a XP non penso dia problemi. Cmq prova...

4ndr34s
07-01-2009, 17:09
mmm non credo sia quello che cerco , io vorrei che se la mia applicazione viene killata me ne deve chiudere un altra
esempio:
mia applicazione e notepad , quando viene killata la mia applicazione viene killato anche il notepad

cionci
07-01-2009, 17:18
mmm non credo sia quello che cerco , io vorrei che se la mia applicazione viene killata me ne deve chiudere un altra
esempio:
mia applicazione e notepad , quando viene killata la mia applicazione viene killato anche il notepad
E' quello che cerchi, lo devi mettere nell'evento unload della form.

4ndr34s
07-01-2009, 18:10
cioè dovrebbe diventare :
private sub form1_unload()
Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szexeFile As String * 260
End Type
'-------------------------------------------------------
Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, _
ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long

Declare Function ProcessFirst Lib "kernel32.dll" Alias "Process32First" (ByVal hSnapshot As Long, _
uProcess As PROCESSENTRY32) As Long

Declare Function ProcessNext Lib "kernel32.dll" Alias "Process32Next" (ByVal hSnapshot As Long, _
uProcess As PROCESSENTRY32) As Long

Declare Function CreateToolhelpSnapshot Lib "kernel32.dll" Alias "CreateToolhelp32Snapshot" ( _
ByVal lFlags As Long, lProcessID As Long) As Long

Declare Function TerminateProcess Lib "kernel32.dll" (ByVal ApphProcess As Long, _
ByVal uExitCode As Long) As Long

Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long


end sub
e poi vabbè il modulo?

cionci
07-01-2009, 18:13
No, metti tutto quello che trovi lì in un modulo. Dopo dall'unload chiami la funzione KillProcess passando come parametro il nome dell'eseguibile.

In ogni caso mi sembra meglio quella linkata da MarcoGG. Sempre che tu abbia lanciato tu l'eseguibile e quindi hai il pid.

4ndr34s
07-01-2009, 18:15
quale parametro intendi? Public Sub KillProcess(NameProcess ?

cionci
07-01-2009, 18:17
quale parametro intendi? Public Sub KillProcess(NameProcess ?
Certo, devi passare il nome dell'eseguibile a KillProcess.

4ndr34s
07-01-2009, 18:17
al posto di nameprocess ci metto il nome del processo che si deve chiudere?

cionci
07-01-2009, 18:18
al posto di nameprocess ci metto il nome del processo che si deve chiudere?
Non al posto. Devi richiamare la funzione KillProcess passando come parametro il nome del processo. Sai come si richiama una funzione in VB ?

4ndr34s
07-01-2009, 18:19
purtroppo no
potresti insegniarmi a farlo?

MarcoGG
07-01-2009, 18:42
E' semplicissimo :

1. Metti tutte le dichiarazioni / chiamate API nell'area di codice (generale)/(dichiarazioni) della Form che vuoi usare :

Private Type LUID
lowpart As Long
highpart As Long
End Type

Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
LuidUDT As LUID
Attributes As Long
End Type

Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Const PROCESS_ALL_ACCESS = &H1F0FFF

Private Declare Function GetVersion Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As _
Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle _
As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias _
"LookupPrivilegeValueA" (ByVal lpSystemName As String, _
ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal _
TokenHandle As Long, ByVal DisableAllPrivileges As Long, _
NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, _
PreviousState As Any, ReturnLength As Any) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As _
Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As _
Long, ByVal uExitCode As Long) As Long

2. Allo stesso modo aggiungi la Function KillProcess ( non te la sto a riscrivere ) nella stessa area dichiarazioni della Form.

3. Il codice utilizzatore c'è già. Lo trovi commentato a metà codice :

' Usage: Dim pID As Long
' pID = Shell("Notepad.Exe", vbNormalFocus)
' '...
' If KillProcess(pID, 0) Then
' MsgBox "Notepad was terminated"
' End If

Questo è il solo ed unico codice che va sotto il Click di un pulsante VB !
Leva i commenti e adattalo alle tue esigenze... ;)

4ndr34s
07-01-2009, 19:13
fino al primo passaggio ci sono , basta che incolli quel codice nel form no? ma dal secondo in poi non riesco a seguire

4ndr34s
07-01-2009, 20:19
adesso il problema è un altro ,sono riuscito a fare tutto ma funziona solo se il processo viene chiuso dalla x della finestra ma se viene killato dal task manager non succ niente.

4ndr34s
07-01-2009, 20:24
mm oppure dato che se il processo viene killato non si puo far nulla , non si potrebbe fare in modo che il processo non si potesse terminare?
cioè se tentano di killarlo gli esce scritto che è impossibile?

cionci
07-01-2009, 20:33
mm oppure dato che se il processo viene killato non si puo far nulla , non si potrebbe fare in modo che il processo non si potesse terminare?
cioè se tentano di killarlo gli esce scritto che è impossibile?
Non credi che sarebbe un po' pericoloso se non si potesse killare ? Solitamente solo i servizi non li puoi terminare così, ma dalla lista dei servizi.

4ndr34s
07-01-2009, 20:36
forse hai ragione ma l'unico rimedio sarebbe quello , se hai una soluzione migliore...

4ndr34s
07-01-2009, 21:31
qualcuno sa dirmi come potrei rendere il mio processo interminabile?

cionci
08-01-2009, 01:18
qualcuno sa dirmi come potrei rendere il mio processo interminabile?
Non puoi...te l'ho spiegato.
L'unico modo è creare un servizio, ma in quel caso è comunque terminabile dalla gestione dei servizi.

4ndr34s
08-01-2009, 06:47
come potrei creare un servizio?

cionci
08-01-2009, 09:14
come potrei creare un servizio?
http://www.google.it/search?q=vb6+create+service&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:it-IT:unofficial&client=firefox-a

La creazione di una servizio è roba abbastanza complessa ed avanzata. Senza contare che VB6 non è sicuramente il linguaggio più adatto per creare un servizio. Quindi è impossibile guidarti passo passo su questa cosa.
Credo che addirittura sia impossibile creare un servizio indipendente, si usano quindi servizi già preconfezionati che permettono si avviare il programma all'avvio del PC, ma non credo che in questo caso sia possibile godere delle proprietà di un servizio.

MarcoGG
08-01-2009, 09:25
- Processo "interminabile" : con VB6 è possibile inibire all'utente l'accesso alla combinazione di tasti CTRL+ALT+CANC. Ci sono in sostanza un paio di modi per farlo. Uno modifica il registro di Win, l'altro credo funzioni solo con Win9x... Non li ho mai provati, e ti consiglio di non rischiare... Inoltre un utente potrebbe sempre, ad esempio, andare su Esegui e aprirsi il Task Manager... La vedo dura.

- Servizi : può essere una buona soluzione, ma VB6 non ha un gran supporto per creare servizi, perciò qui ti consiglierei di passare a VB NET.
Se invece vuoi insistere su VB6 ( buona fortuna... :D ), qui trovi un bel tutorial su come implementare un servizio VB6 su WinNT :

http://vbcity.com/forums/faq.asp?fid=6&cat=Windows&#TID18253

4ndr34s
08-01-2009, 14:30
ma se creo un servizio a cosa potrebbe mai servirmi?

4ndr34s
08-01-2009, 14:34
mmm e se facessi un .bat che eseguisse tutto? mmmm

4ndr34s
08-01-2009, 14:36
riguardo la questione del vb.net non credo sia possibile dato che alcune stringhe non funzionano sul vb.net

cionci
08-01-2009, 14:40
riguardo la questione del vb.net non credo sia possibile dato che alcune stringhe non funzionano sul vb.net
Chiaro, sono linguaggi che condividono in parte la sintassi, ma sono profondamente diversi.
I linguaggi vanno studiati, non si può andare a caso ;)

4ndr34s
08-01-2009, 15:30
giusto. ora ho trovate come creare un service ma si termina lo stesso con quale account dovrei creare questo servizio????????

4ndr34s
08-01-2009, 21:46
qualcuno sa come aiutarmi?