Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
9 sept. 2008 à 17:15
cs_ginger4957
Messages postés69Date d'inscriptionjeudi 8 janvier 2009StatutMembreDernière intervention 3 septembre 2010
-
12 févr. 2009 à 09:57
Bonjour ,
Je développe un logiciel qui doit (entre autre) exécuté un ".cmd" et attendre sa mort.
J'ai rencontré un problème (qui m'a bloqué presque deux heure pour une connerie) :
"Run-time
exception thrown : System.AccessViolationException - Tentative de
lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une
autre mémoire est endommagée."
Cette erreur se corrige TRÈS facilement (quand on sait comment )
Il faut tout simplement déclarer les variable utilisé dans les API en Int32 et non pas en Long (l'info n'es pas dans MSDN , ou je ne l'es pas trouvé
)
Aller en prime mon titi module en cadeau
<hr size="2" width="100%" />Module ModuleShell
'------------------------------------------------------------------------------
'Objectif :
' Gérer les taches à exécuté
'Liste des fonctions public et résumé :
' - Contain_ID_Tache : Test si l'ID_Tache existe dans la collection
' - ExecuteTache : Exécute une tache (exe, bat, cmd, ...) et retourne le ProssessID
' - ExecuteTacheAttendMort : Exécute une tache et attend sa mort pour quitter la fonction
' - TacheEnCours (sur défini) : Test si un processus est actif (en mémoire)
' - TueTache (sur défini) : Tue une tache en exécution (en mémoire)
' - RetrouveProssessID : Retourne le ProssessID de la tache nommé
'
' Fait le : 09/09/2008
' Fait par Waurzuczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Int32)
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Int32, ByVal uExitCode As Int32) As Int32
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal
ProcessHandle As Int32, ByVal DesiredAccess As Int32, ByVal TokenHandle
As Int32) As Int32
Private Declare Function OpenProcess Lib
"Kernel32.dll" (ByVal dwDesiredAccess As Int32, ByVal bInheritHandle As
Int32, ByVal dwProcessID As Int32) As Int32
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Int32, ByRef lpExitCode As Int32) As Int32
Private ListeTache As New System.Collections.Generic.Dictionary(Of String, Long)
Private Const CoIn32_DelaisAttenteEntreTestMort As Int32 = 1000
'------------------------------------------------------------------------------
'Objectif :
'Test si l'ID_Tache existe dans la collection
' Input :
' ID_Tache = Un nom de tache en toute lettre
' Output
' Boolean = Vrais si l'ID_Tache existe dans la collection faux si non
' Fait le : 09/09/2008
' Fait par Waurzuczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function Contain_ID_Tache(ByVal ID_Tache As String) As Boolean
Return ListeTache.ContainsKey(ID_Tache)
End Function
'------------------------------------------------------------------------------
'Objectif :
'Exécute une tache et retourne le ProssessID
' Input :
' FichierExecutable : Chemin complet de la tache à exécuté
' ID_Tache (optionnel) : Nom à stocké pour retrouver le ProssessID
' Output
' Long = Le ProssessID de la tache ou 0 si erreur (fichier exécutable non trouvé)
' Fait le : 09/09/2008
' Fait par Waurzuczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function ExecuteTache(ByVal FichierExecutable As String, Optional ByVal ID_Tache As String = Nothing) As Long
Dim ProssessID As Int32
Try
ProssessID = Shell(FichierExecutable)
If ID_Tache IsNot Nothing Then
ListeTache.Add(ID_Tache, ProssessID)
End If
Return ProssessID
Catch ex As Exception
Return 0
End Try
End Function
'------------------------------------------------------------------------------
'Objectif :
'Exécute une tache et attend sa mort pour quitter la fonction
' Input :
' FichierExecutable : Chemin complet de la tache à exécuté
' Output
' Boolean = Vrais si pas de problème faux si non (fichier exécutable non trouvé)
' Fait le : 09/09/2008
' Fait par Waurzuczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function ExecuteTacheAttendMort(ByVal FichierExecutable As String) As Boolean
Dim ProssessID As Long
ProssessID = ExecuteTache(FichierExecutable)
If ProssessID <> 0 Then
While TacheEnCours(ProssessID)
Sleep(CoIn32_DelaisAttenteEntreTestMort)
Application.DoEvents()
End While
Return True
Else
Return False
End If
End Function
'------------------------------------------------------------------------------
'Objectif :
'Test si la tache passé en paramètre est active (en mémoire)
' Input :
' ID_Tache : Nom de la tache (nom passé à ExecuteTache)
' Output
' Boolean : Vrais si la tache est en cours Faux si non
' Si la tache n'est plus en cours elle est supprimer de la collection
' Si le nom de la tache n'existe pas dans la collection retourne Faux
' Fait le : 09/09/2008
' Fait par Waurzuczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function TacheEnCours(ByVal ID_Tache As String) As Boolean
If ListeTache.ContainsKey(ID_Tache) Then
If TacheEnCours(ListeTache(ID_Tache)) Then
Return True
Else
ListeTache.Remove(ID_Tache)
Return False
End If
Else
Return False
End If
End Function
'------------------------------------------------------------------------------
'Objectif :
'Test si la tache passé en paramètre est active (en mémoire)
' Input :
' ProssessID : Le ProssessID à tester
' Output
' Boolean : Vrais si la tache est en cours Faux si non
' Fait le : 09/09/2008
' Fait par Waurzuczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function TacheEnCours(ByVal ProssessID As Long) As Boolean
Dim lExitCode As Int32
GetExitCodeProcess(OpenProcess(&H1F0FFF, 0&, ProssessID), lExitCode)
Return (lExitCode = &H103&)
End Function
'------------------------------------------------------------------------------
'Objectif :
'Tue la tache passé en paramétre
' Input :
' ID_Tache : Nom de la tache (nom passé à ExecuteTache)
' Output
' Boolean : Vrais si la tache à été correctement tuée
' Si la tache n'est plus en cours elle est supprimer de la collection
' Si le nom de la tache n'existe pas dans la collection retourne Faux
' Fait le : 09/09/2008
' Fait par Waurzuczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function TueTache(ByVal ID_Tache As String) As Boolean
If ListeTache.ContainsKey(ID_Tache) Then
If TueTache(ListeTache(ID_Tache)) Then
ListeTache.Remove(ID_Tache)
Return True
Else
Return False
End If
Else
Return False
End If
End Function
'------------------------------------------------------------------------------
'Objectif :
'Tue la tache passé en paramètre
' Input :
' ProssessID : Le ProssessID à tué
' Output
' Boolean : Vrais si la tache à été correctement tuée ou si elle étais déjà morte
' Faux en cas d'erreur (normalement n'arrive jamais)
' Fait le : 09/09/2008
' Fait par Waurzuczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function TueTache(ByVal ProssessID As Long) As Boolean
Try
If TacheEnCours(ProssessID) Then
Dim lngHwndProcess As Long
lngHwndProcess = OpenProcess(&H1F0FFF, 0&, ProssessID)
TerminateProcess(lngHwndProcess, 0&)
End If
Return True
Catch ex As Exception
Return False
End Try
End Function
'------------------------------------------------------------------------------
'Objectif :
'Retourne le ProssessID de la tache nommé
' Input :
' ID_Tache : Nom de la tache (nom passé à ExecuteTache)
' Output
' Long : Le ProssessID de la tache ou 0 si elle n'existe pas dans la collection
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function RetrouveProssessID(ByVal ID_Tache As String) As Long
If ListeTache.ContainsKey(ID_Tache) Then
Return ListeTache(ID_Tache)
Else
Return 0
End If
End Function
End Module
<hr size="2" width="100%" />
PS :
Je poste ce message pour que si d'autre rencontre se problème ils sachent le corigé rapidement.
Vous
pouvez bien entendu utilisé les fonctions présentes dans ce message.
Mais merci de ne pas supprimer les entêtes de fonctions et de module.
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 9 sept. 2008 à 17:28
Déjà une Maj
Un oublie DZL (ajout des fonctions AttendMort)
<hr size="2" width="100%" />Module ModuleShell
'------------------------------------------------------------------------------
'Objectif :
' Gérer les taches à exécuté
'Liste des fonctions public et résumé :
' - Contain_ID_Tache : Test si l'ID_Tache existe dans la collection
' - ExecuteTache : Exécute une tache (exe, bat, cmd, ...) et retourne le ProssessID
' - ExecuteTacheAttendMort : Exécute une tache et attend sa mort pour quitter la fonction
' - TacheEnCours (sur défini) : Test si un processus est actif (en mémoire)
' - TueTache (sur défini) : Tue une tache en exécution (en mémoire)
' - RetrouveProssessID : Retourne le ProssessID de la tache nommé
' - AttendMort (sur défini) : Attend la mort d'une tache
'
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.1
'------------------------------------------------------------------------------
Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Int32)
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Int32, ByVal uExitCode As Int32) As Int32
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Int32, ByVal DesiredAccess As Int32, ByVal TokenHandle As Int32) As Int32
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccess As Int32, ByVal bInheritHandle As Int32, ByVal dwProcessID As Int32) As Int32
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Int32, ByRef lpExitCode As Int32) As Int32
Private ListeTache As New System.Collections.Generic.Dictionary(Of String, Long)
Private Const CoIn32_DelaisAttenteEntreTestMort As Int32 = 1000
'------------------------------------------------------------------------------
'Objectif :
'Test si l'ID_Tache existe dans la collection
' Input :
' ID_Tache = Un nom de tache en toute lettre
' Output
' Boolean = Vrais si l'ID_Tache existe dans la collection faux si non
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function Contain_ID_Tache(ByVal ID_Tache As String) As Boolean
Return ListeTache.ContainsKey(ID_Tache)
End Function
'------------------------------------------------------------------------------
'Objectif :
'Exécute une tache et retourne le ProssessID
' Input :
' FichierExecutable : Chemin complet de la tache à exécuté
' ID_Tache (optionnel) : Nom à stocké pour retrouver le ProssessID
' Output
' Long = Le ProssessID de la tache ou 0 si erreur (fichier exécutable non trouvé)
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function ExecuteTache(ByVal FichierExecutable As String, Optional ByVal ID_Tache As String = Nothing) As Long
Dim ProssessID As Int32
Try
ProssessID = Shell(FichierExecutable)
If ID_Tache IsNot Nothing Then
ListeTache.Add(ID_Tache, ProssessID)
End If
Return ProssessID
Catch ex As Exception
Return 0
End Try
End Function
'------------------------------------------------------------------------------
'Objectif :
'Exécute une tache et attend sa mort pour quitter la fonction
' Input :
' FichierExecutable : Chemin complet de la tache à exécuté
' Output
' Boolean = Vrais si pas de problème faux si non (fichier exécutable non trouvé)
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function ExecuteTacheAttendMort(ByVal FichierExecutable As String) As Boolean
Dim ProssessID As Long
ProssessID = ExecuteTache(FichierExecutable)
If ProssessID <> 0 Then
AttendMort(ProssessID)
Return True
Else
Return False
End If
End Function
'------------------------------------------------------------------------------
'Objectif :
'Test si la tache passé en paramètre est active (en mémoire)
' Input :
' ID_Tache : Nom de la tache (nom passé à ExecuteTache)
' Output
' Boolean : Vrais si la tache est en cours Faux si non
' Si la tache n'est plus en cours elle est supprimer de la collection
' Si le nom de la tache n'existe pas dans la collection retourne Faux
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function TacheEnCours(ByVal ID_Tache As String) As Boolean
If ListeTache.ContainsKey(ID_Tache) Then
If TacheEnCours(ListeTache(ID_Tache)) Then
Return True
Else
ListeTache.Remove(ID_Tache)
Return False
End If
Else
Return False
End If
End Function
'------------------------------------------------------------------------------
'Objectif :
'Test si la tache passé en paramètre est active (en mémoire)
' Input :
' ProssessID : Le ProssessID à tester
' Output
' Boolean : Vrais si la tache est en cours Faux si non
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function TacheEnCours(ByVal ProssessID As Long) As Boolean
Dim lExitCode As Int32
GetExitCodeProcess(OpenProcess(&H1F0FFF, 0&, ProssessID), lExitCode)
Return (lExitCode = &H103&)
End Function
'------------------------------------------------------------------------------
'Objectif :
'Tue la tache passé en paramétre
' Input :
' ID_Tache : Nom de la tache (nom passé à ExecuteTache)
' Output
' Boolean : Vrais si la tache à été correctement tuée
' Si la tache n'est plus en cours elle est supprimer de la collection
' Si le nom de la tache n'existe pas dans la collection retourne Faux
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function TueTache(ByVal ID_Tache As String) As Boolean
If ListeTache.ContainsKey(ID_Tache) Then
If TueTache(ListeTache(ID_Tache)) Then
ListeTache.Remove(ID_Tache)
Return True
Else
Return False
End If
Else
Return False
End If
End Function
'------------------------------------------------------------------------------
'Objectif :
'Tue la tache passé en paramètre
' Input :
' ProssessID : Le ProssessID à tué
' Output
' Boolean : Vrais si la tache à été correctement tuée ou si elle étais déjà morte
' Faux en cas d'erreur (normalement n'arrive jamais)
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function TueTache(ByVal ProssessID As Long) As Boolean
Try
If TacheEnCours(ProssessID) Then
Dim lngHwndProcess As Long
lngHwndProcess = OpenProcess(&H1F0FFF, 0&, ProssessID)
TerminateProcess(lngHwndProcess, 0&)
End If
Return True
Catch ex As Exception
Return False
End Try
End Function
'------------------------------------------------------------------------------
'Objectif :
'Retourne le ProssessID de la tache nommé
' Input :
' ID_Tache : Nom de la tache (nom passé à ExecuteTache)
' Output
' Long : Le ProssessID de la tache ou 0 si elle n'existe pas dans la collection
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function RetrouveProssessID(ByVal ID_Tache As String) As Long
If ListeTache.ContainsKey(ID_Tache) Then
Return ListeTache(ID_Tache)
Else
Return 0
End If
End Function
'------------------------------------------------------------------------------
'Objectif :
'Attend la mort de la tache reçu
' Input :
' ID_Tache : Nom de la tache (nom passé à ExecuteTache)
' Output
' Boolean : Faux si ID_Tache n'existe pas dans la collection
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Function AttendMort(ByVal ID_Tache As String) As Boolean
If ListeTache.ContainsKey(ID_Tache) Then
AttendMort(ListeTache(ID_Tache))
Return True
Else
Return False
End If
End Function
'------------------------------------------------------------------------------
'Objectif :
'Attend la mort de la tache reçu
' Input :
' ProssessID : Le ProssessID de la tache
' Fait le : 09/09/2008
' Fait par Waurzyczka Vincent (Polack77)
' Version 1.0
'------------------------------------------------------------------------------
Public Sub AttendMort(ByVal ProssessID As Long)
While TacheEnCours(ProssessID)
Sleep(CoIn32_DelaisAttenteEntreTestMort)
End While
End Sub
End Module
<hr size="2" width="100%" />
Amicalement
Pensez "Réponse acceptée"
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 9 sept. 2008 à 20:38
"...Il faut tout simplement déclarer les variable utilisé dans les API en Int32 et non pas en Long (l'info n'es pas dans MSDN , ou je ne l'es pas trouvé
)...."
Si, si, elle y est, et à plusieurs endroits même. Même si parfois il faut savoir lire entre les lignes.
(Appel de code non managé, Différences entre VB6 et .Net, Utilisation des dll système, ........)
Et elle est même répétée plusieurs fois par semaine, ici même, sur le forum : Tout ce qui est déclaré en Long dans une API Windows est à déclarer en Integer en .Net
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 10 sept. 2008 à 10:30
Heeee oui en effet .
On vas dire que je n'avais pas trop la pèche hier (je crois même que j'avais déjà posté sa ici, mais pas le module en cadeau, au moins mon post ne serviras pas à RIEN. Mais à presque rien )
Bonne prog
Amicalement
Pensez "Réponse acceptée"
Vous n’avez pas trouvé la réponse que vous recherchez ?
Je ne vois pas pourquoi il m'affiche ce message d'erreur alors que la conversion a bien été faite de Long à Integer ? Si vous avez quelque chose qui peut m'aider merci d'avance
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 11 févr. 2009 à 10:53
Tu pourrais nous en dire un peut plus ?
L'API utilisé, l'entête de fonction de "appelle_fonction", la ligne où est retourné l'exception
pck là c'est un peut juste quand même .
PS :
Crée une autre discution sur CS pour posé ta question colle simplement le lient ici à la rigueur, si non seul casy, qui à participé à ce topic, et moi ne verront ton message. Ici nous somme dans une discution crée il y à déjà pas mal de temps, et résolut en prime, donc il n'y à pas grand monde qui passe par ici