Il y a quelques temps, j'ai eu à réaliser un programme tournant en tâche de fond . Il devait lancer, au fur et à mesure que des documents se présentaient,lancer un programme avec un chaine de commande correspondant aux documents.(ShellExecute). Aux tests, tout était parfait. En mise en production, les documents arrivaient tellement vite que j'avais des centaines de programme lancés quasi simultanément et la machine s'effondrait litéralement sous la charge. J'ai donc developpé ce composant qui prends en charge le lancement et l'arret du programme lancé, ce qui permet par exemple de ne lancer un autre programme que quand un autre est fini.
En y étant, j'ai peaufiné le composant qui est maintenant capable de lancer l'excécution d'un programme avec ou sans chaîne de commande, de lancer un fichier (s'il est de type connu de windows).Le tout en choissisant le mode fenêtre (Normal,Minimisé,Maximisé,Masqué) el le mode synchrone ou asynchrone.
Cerise sur le gateau, il est possible de donner une indication personnalisée qui sera liée au programme lancé, qui sera bien utile s'il y a plusieurs occurences du même programme.

Lancer un programme se fait par la commande

Code : Sélectionner tout - Visualiser dans une fenêtre à part
LandF1.ShellProg NomExe, Commande, Synchrone, WindowStyle , Tag
Un événement est levé quand le programme demarre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Private Sub LandF1_Started(ProgName As String, Cmd As String, Tag As Variant, ProcessId As Long)
  MsgBox "Le programme " & ProgName & " vient de démarrer" & vbCrLf & _
          "Chaine de commande : " & Cmd & vbCrLf & _
          "Tag personalisé : " & Tag
End Sub
Et quand il se termine
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Private Sub LandF1_Finished(ProgName As String, Cmd As String, Tag As Variant, ProcessId As Long)
  MsgBox "Le programme " & ProgName & " vient de se terminer" & vbCrLf & _
          "Chaine de commande : " & Cmd & vbCrLf & _
          "Tag personalisé : " & Tag
End Sub
Reste une derniére possibilité du composant, killer le programme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
LandF1.TerminateProg ProcessId
ProcessId ayant été fourni par l'evénement Started


OCX DiLaunchAndForget6.zip