J'ai un petit problème que j'arrive pas à résoudre. J'ai une ListBox dans laquelle va s'afficher un résultat (si le programme est bien installé ou non) au fur et à mesure qu'une instruction pour un programme précis sera terminé.
Mais lorsque je choisis d'installer 2 programmes, les instructions vont s'effectuer. Cependant à la fin de celles-ci, le code devrait s'arrêter là pour afficher définitivement la ListBox avec les résultats, mais non! Et là on est repartit pour un tour, parce qu'au final les 2 programmes comptent en réalité pour 2 tours de manège. Le problème sera le même si je choisis 10 programmes, il va me faire 10 tours de toutes les instructions au total, et me réinstaller à chaque tour les programmes précédemment installés... Je ne sais pas comment arrêter cette boucle. Exit Sub ne marche pas, et ce problème ne se produit pas lorsque je met une TextBox ( TextBox qui m'affiche qu'un résultat: celui de la dernière instruction... ).
Merci d'avance si y'a bien quelqu'un qui accepte de m'aider.
Extrait du code:
'------------------------ CODE DE LA FORM_RESULTATS:----------------------------
Public Class Resultat
Dim appliInstalle As Boolean = True
Dim appliEXEPresente As Boolean = True
Dim appliMSIPresente As Boolean = True
Private Sub Resultat_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load, MyBase.VisibleChanged
'PAINT NET
Try
'Si le fichier est présent dans le dossier temporaire, alors
If File.Exists("C:\WINDOWS\Temp\PACKSOFT\paintnet.exe") Then
appliEXEPresente = True
'commence la procédure d'installation
If appliEXEPresente = True Then
'/!\ Il faut donner le chemin absolut, sinon il ne trouve pas le fichier!
Process.Start(New ProcessStartInfo("C:\WINDOWS\Temp\PACKSOFT\paintnet.exe", "/ auto / CheckForUpdates = 0 DESKTOPSHORTCUT = 1 "))
'si c'est un succès, alors ajoute dans la textbox
Me.ListBox_Resultat.Items.Add("V paintnet.exe")
Else
Exit Try
End If
'si ça passe par là, alors pas d'erreurs, Process.Start est réussit
appliInstalle = True
End If
'sinon, si c'est un échec ou une erreur, alors ajoute dans la textbox
Catch erreur As Exception
MessageBox.Show("Install échouée. " & erreur.GetBaseException.Message)
Me.ListBox_Resultat.Items.Add("X paintnet.exe")
End Try
'SHOCK WARE
Try
'Si le fichier est présent dans le dossier temporaire, alors
If File.Exists("C:\WINDOWS\Temp\PACKSOFT\shockware.exe") Then
appliEXEPresente = True
'commence la procédure d'installation
If appliEXEPresente = True Then
'/!\ Il faut donner le chemin absolut, sinon il ne trouve pas le fichier!
Process.Start(New ProcessStartInfo("C:\WINDOWS\Temp\PACKSOFT\shockware.exe", "/S"))
'si c'est un succès, alors ajoute dans la textbox
Me.ListBox_Resultat.Items.Add("V shockware.exe")
Else
Exit Try
End If
'si ça passe par là, alors pas d'erreurs, Process.Start est réussit
appliInstalle = True
End If
'sinon, si c'est un échec ou une erreur, alors ajoute dans la textbox
Catch erreur As Exception
MessageBox.Show("Install échouée. " & erreur.GetBaseException.Message)
Me.ListBox_Resultat.Items.Add("X shockware.exe")
End Try
'SILVERLIGHT
Try
'Si le fichier est présent dans le dossier temporaire, alors
If File.Exists("C:\WINDOWS\Temp\PACKSOFT\silverlight.exe") Then
appliEXEPresente = True
'commence la procédure d'installation
If appliEXEPresente = True Then
'/!\ Il faut donner le chemin absolut, sinon il ne trouve pas le fichier!
Process.Start(New ProcessStartInfo("C:\WINDOWS\Temp\PACKSOFT\silverlight.exe", "/q"))
'si c'est un succès, alors ajoute dans la textbox
Me.ListBox_Resultat.Items.Add("V silverlight.exe")
Else
Exit Try
End If
'si ça passe par là, alors pas d'erreurs, Process.Start est réussit
appliInstalle = True
End If
'sinon, si c'est un échec ou une erreur, alors ajoute dans la textbox
Catch erreur As Exception
MessageBox.Show("Install échouée. " & erreur.GetBaseException.Message)
Me.ListBox_Resultat.Items.Add("X silverlight.exe")
End Try
End Sub
End Class
' --------------- APPEL DE LA FORM_RESULTAT POUR L'AFFICHAGE:--------------------
Private Sub btn_Installer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Installer.Click
Resultat.Show()
'Dim ViderDossier As String = "C:\WINDOWS\Temp\PACKSOFT"
'If System.IO.Directory.Exists(ViderDossier) Then
' For Each files As String In My.Computer.FileSystem.GetFiles(ViderDossier)
' My.Computer.FileSystem.DeleteFile(files)
' Next
' 'System.IO.Directory.Delete(ViderDossier)
'End If
End Sub
J'ai utilisé à méthode Process.WaitForExit() comme ceci:
Dim install As Process
install Process.Start(New ProcessStartInfo("C:\WINDOWS\Temp\PACKSOFT\paintnet.exe", "/ auto / CheckForUpdates 0 DESKTOPSHORTCUT = 1 "))
install.WaitForExit()
Cela permet d'attendre la fin du processus avant de passer à d'autres instructions. Comme ça, l'ordre dans lequel les choses doivent se dérouler est respecté.
J'ai trouvé pourquoi ça bouclait: j'avais activé VisibleChanged sur la Form_Resultat.
Donc je l'ai enlevé.
Mais maintenant l'installation d'un programme est à peine finit qu'on passe directement à la suite des évènements, ce qui fait qu'il y a des confusions et une erreur qui survient à cette ligne:
My.Computer.FileSystem.DeleteFile(files)
:
L'exception UnauthorizedAccessException n'a pas été gérée. L'accès au chemin d'accès 'C:\WINDOWS\Temp\PACKSOFT\paintnet.exe' est refusé.
normale car Paint.NET est à peine finit d'être installé que faudrait déjà supprimer son fichier d'exécution...
(J'ai enlevé les commentaires autour de la suppression des fichiers.)
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 22 nov. 2012 à 11:06
Bonjour,
Je ne comprends pas trop, mais devine qu'il te suffirait d'utiliser une variable booléenne par programme à installer.
Chacune de ces variables, false au départ, pourrait être mise à True si fichier installé. Il te suffirait alors de dire que tu n'installes un fichier que si la variable lui correspondant est encore à False.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Vous n’avez pas trouvé la réponse que vous recherchez ?
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 22 nov. 2012 à 11:20
Je ne comprends d'ailleurs pas pourquoi tu mets dans une seule procédure l'installation, les uns à la suite des autres, de tes fichiers.
Il te suffirait d'utiliser une seule procédure paramétrée, à laquelle tu passerais en paramètre le fichier à installé (les fichiers à installer étant dans une liste à parcourir pour installer, l'un après l'autre, chacun de ces fichiers !)
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
pour ce qui est de ton deuxième post, j'y avais bien pensé, mais je savais pas trop comment m'y prendre, et manque de temps, j'ai voulu aller vers la solution qui me semblait la plus "facile" on va dire (solution hyper longue surtout, mais bon...)
J'avais pensé aussi à WaitForExit() mais le problème est que s'il y a un des programmes qui ne peut pas être installé pour X raisons, je dois passer à l'installation suivante malgré tout.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 22 nov. 2012 à 14:17
j'ai voulu aller vers la solution qui me semblait la plus "facile"
erreur habituelle et non justifiée. jer ne vois pas où est la difficulté à passer un paramètre à une procédure !
Il y a un paradoxe assez évident entre avoir envie de distribuer une appli et ne pas maîtriser cet aspect ultra-simple ! Le seconde proposition de cette dernière phrase mettrait en doute la justification de la première !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Chacune de ces variables, false au départ, pourrait être mise à True si fichier installé.
Comment savoir si Process.Start est finit (installation réussit ou non)?
En gros, faudrait que je donne ça comme instruction:
Si le fichier existe dans le dossier,
Alors lance process.Start
Tant que process.Start est en cours,
La variable booléenne reste à false.
Si process.Start a finit ou est interrompu,
Alors la variable booléenne passe à true.
C'est le moyen de savoir si Process.Start est en cours ou non, qui me manque.
Et de dire aussi passe à la suite si c'est true... J'ai jamais été douée avec les manipulations de booléen.
C'est dommage, ça t'aurait évité un 'gel' de ton thread principal pendant ton WaitForExit() en facilitant la gestion de lancement de tes setup (if/eleif...) inutiles.