View Full Version : [vb6]Processi
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?
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
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
;)
hem c'è scritto che funziona solo su NT e 2000 :-S
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...
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
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.
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?
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.
quale parametro intendi? Public Sub KillProcess(NameProcess ?
quale parametro intendi? Public Sub KillProcess(NameProcess ?
Certo, devi passare il nome dell'eseguibile a KillProcess.
al posto di nameprocess ci metto il nome del processo che si deve chiudere?
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 ?
purtroppo no
potresti insegniarmi a farlo?
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... ;)
fino al primo passaggio ci sono , basta che incolli quel codice nel form no? ma dal secondo in poi non riesco a seguire
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.
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?
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.
forse hai ragione ma l'unico rimedio sarebbe quello , se hai una soluzione migliore...
qualcuno sa dirmi come potrei rendere il mio processo interminabile?
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.
come potrei creare un servizio?
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.
- 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
ma se creo un servizio a cosa potrebbe mai servirmi?
mmm e se facessi un .bat che eseguisse tutto? mmmm
riguardo la questione del vb.net non credo sia possibile dato che alcune stringhe non funzionano sul vb.net
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 ;)
giusto. ora ho trovate come creare un service ma si termina lo stesso con quale account dovrei creare questo servizio????????
qualcuno sa come aiutarmi?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.