2008-11-25 3 views

Répondre

2

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.

0

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 :)

+0

C'est une solution bon marché, je l'aime bien. –

0

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.

3

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 :)

Questions connexes