J'ai un programme qui a tendance à se bloquer assez souvent pendant que je dors et je dois continuer à fonctionner. J'ai donc pensé que je pourrais écrire une application vb6 qui surveille la liste des processus, si quelque chose disparaît, il va le relancer. Quelqu'un sait-il d'une manière facile?Les processus de surveillance pour voir si ils se sont plantés dans vb6
Répondre
Utilisez WMI.
Si vous êtes bloqué avec VB6, recherchez sur le Web WMI + VB6.
Sinon, l'interfaçage C# et WMI est beaucoup plus facile.
Je l'ai utilisé une tâche planifiée (en cours d'exécution à chaque 10 min), à partir fichier cmd avec le contenu suivant:
tasklist | trouver "myapp.exe"> || NUL c: \ monchemin \ myapp.exe
Vous pouvez exécuter ce fichier de commande à partir VB6 Shell ou tout simplement utiliser Planificateur de tâches :)
J'utilise un programme qui exécute d'autres programmes. De cette façon, vous pouvez interroger la poignée de processus pour voir si l'application est toujours en cours d'exécution. Sinon, vous pouvez le lancer à nouveau. Cela nécessite une programmation API.
Vous pouvez utiliser EnumProcesses à la liste tous les processus dans le système au moment où vous êtes-vous courir pouvez utiliser cette déclaration pour l'utiliser
Public Declare Function EnumProcesses Lib "psapi.dll" (_
ByRef idProcess As Long, ByVal cb As Long, _
ByRef cbNeeded As Long) As Long
Avant de l'utiliser vous devez définir un tableau de long pour passer en un argument à EnumProcesses avec suffisamment d'espace pour lire tous les identifiants de processus. Vous pouvez appeler EnumProcesses deux fois pour découvrir la taille de ce tableau. Après le deuxième appel, vous pouvez commencer à boucler ce tableau et ouvrir les processus obtenant ainsi un handle utilisé de manière appropriée peut vous dire le nom du processus exécutable et comparer ces données avec le nom de l'exécutable que vous recherchez est terminé . Sinon, si ce que vous cherchez est une DLL par exemple, vous pourriez EnumProcessModules pour ce processus gérer la recherche de chaque processus en cours d'exécution pour la DLL que vous recherchez. la déclaration de EnumProcessModules est ce
Public Declare Function EnumProcessModules Lib "psapi.dll" (_
ByVal hProcess As Long, ByRef lphModule As Long, _
ByVal cb As Long, ByRef cbNeeded As Long) As Long
et le code probable que vous auriez besoin serait quelque chose comme ce code de fonction
Option Explicit
Private Declare Function OpenProcess Lib "Kernel32.dll" (_
ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, _
ByVal dwProcId As Long) As Long
Private Declare Function EnumProcesses Lib "psapi.dll" (_
ByRef lpidProcess As Long, ByVal cb As Long, _
ByRef cbNeeded As Long) As Long
Private Declare Function GetModuleFileNameExA Lib "psapi.dll" (_
ByVal hProcess As Long, ByVal hmodule As Long, _
ByVal moduleName As String, ByVal nSize As Long) As Long
Private Declare Function EnumProcessModules Lib "psapi.dll" (_
ByVal hProcess As Long, ByRef lphModule As Long, _
ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Public Function IsModuleRunning(ByVal theModuleName As String) As Boolean
Dim aProcessess(1 To 1024) As Long ' up to 1024 processess?'
Dim bytesNeeded As Long
Dim i As Long
Dim nProcesses As Long
Dim hProcess As Long
Dim found As Boolean
EnumProcesses aProcessess(1), UBound(aProcessess), bytesNeeded
nProcesses = bytesNeeded/4
For i = 1 To nProcesses
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, aProcessess(i))
If (hProcess) Then
Dim hmodule(1 To 1024) As Long ' no more than 1024 modules per process?'
bytesNeeded = 0
If EnumProcessModules(hProcess, hmodule(1), 1024 * 4, bytesNeeded) Then
Dim nModules As Long
Dim j As Long
Dim moduleName As String
moduleName = Space(1024) ' module name should have less than 1024 bytes'
nModules = bytesNeeded/4
For j = 1 To nModules
Dim fileNameLen As Long
fileNameLen = GetModuleFileNameExA(hProcess, hmodule(j), moduleName, 1024)
moduleName = Left(moduleName, fileNameLen)
If Right(LCase(moduleName), Len(theModuleName)) = LCase(theModuleName) Then
found = True
Exit For
End If
Next
End If
End If
CloseHandle hProcess
If found Then Exit For
Next
IsModuleRunning = found
End Function
Private Sub Form_Load()
MsgBox IsModuleRunning("explorer.exe")
End Sub
est un peu long, mais l'appelant est une petite fonction, vous pouvez Utilisez-le si vous voulez le tester un peu :)
C'est une solution bon marché, je l'aime bien. –