Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment capturer le code d'erreur avec l'API ShellExecute ?

4 réponses
Avatar
Teddy
Bonjour,

Je cherche désespérément comment récupérer le code d'erreur retourné si l'ouverture d'un
fichier documentaire avec le logiciel associé dans l'OS échoue avec l'API ShellExecute.

S'il y a un problème, on n'a pas de remontée d'erreur dans Err.Number apparemment.

D'autre part, si je cherche à ouvrir la messagerie par défaut avec l'API ShellExecute en
mettant en tant que document à ouvrir la chaîne
"mailto:adresse@toto.com?subject=MonSujet&body=Corps-du-Message", ça fonctionne bien avec
Outlook Express mais pas avec Outlook.

Outlook 2003 n'accepte peut-être pas ce genre de paramètre pourtant ça marche lorsque
c'est dans un lien d'une page WEB.

Auriez vous une idée ?

Merci beaucoup.
Ted

4 réponses

Avatar
Drizzit
Source trouvé sur le site de microsoft :
http://support.microsoft.com/default.aspx?scid=kb;fr;170918

Option Explicit

Private Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpszOp As _
String, ByVal lpszFile As String, ByVal lpszParams As String, _
ByVal lpszDir As String, ByVal FsShowCmd As Long) As Long

Private Declare Function GetDesktopWindow Lib "user32" () As Long

Const SW_SHOWNORMAL = 1

Const SE_ERR_FNF = 2&
Const SE_ERR_PNF = 3&
Const SE_ERR_ACCESSDENIED = 5&
Const SE_ERR_OOM = 8&
Const SE_ERR_DLLNOTFOUND = 32&
Const SE_ERR_SHARE = 26&
Const SE_ERR_ASSOCINCOMPLETE = 27&
Const SE_ERR_DDETIMEOUT = 28&
Const SE_ERR_DDEFAIL = 29&
Const SE_ERR_DDEBUSY = 30&
Const SE_ERR_NOASSOC = 31&
Const ERROR_BAD_FORMAT = 11&

Function StartDoc(DocName As String) As Long
Dim Scr_hDC As Long
Scr_hDC = GetDesktopWindow()
StartDoc = ShellExecute(Scr_hDC, "Open", DocName, _
"", "C:", SW_SHOWNORMAL)
End Function

Private Sub Form_Click()
Dim r As Long, msg As String
r = StartDoc("C:WINDOWSARCADE.BMP")
If r <= 32 Then
'Une erreur s'est produite
Select Case r
Case SE_ERR_FNF
msg = "Fichier introuvable"
Case SE_ERR_PNF
msg = "Chemin introuvable"
Case SE_ERR_ACCESSDENIED
msg = "Accès refusé"
Case SE_ERR_OOM
msg = "Mémoire insuffisante"
Case SE_ERR_DLLNOTFOUND
msg = "DLL introuvable"
Case SE_ERR_SHARE
msg = "Violation de partage"
Case SE_ERR_ASSOCINCOMPLETE
msg = "Association de fichier incomplète ou
incorrecte"
Case SE_ERR_DDETIMEOUT
msg = "Expiration de délai DDE"
Case SE_ERR_DDEFAIL
msg = "Échec de la transaction DDE"
Case SE_ERR_DDEBUSY
msg = "DDE occupé"
Case SE_ERR_NOASSOC
msg = "Pas d'association pour l'extension de
fichier"
Case ERROR_BAD_FORMAT
msg = "Fichier EXE incorrect ou erreur dans
l'image EXE"
Case Else
msg = "Erreur inconnue"
End Select
MsgBox msg
End If
End Sub
Avatar
Drizzit
Pardon, je n'ai pas lu la totalité de la question.
Pour ma part l'instruction "mailto:...." m' ouvre bien l'application
Outlook qui est mon application courrier par défaut, Outlook express
étant installé également sur le poste.
Avatar
Guy DETIENNE
Salut ;O)

Normalement, on utilisera l'API GetLastError pour connaître le dernier code
d'erreur retourné par une API.
Malheureusement, il est fortement déconseillé de l'utiliser via VB car il
est fréquent que le code retourné soit différent de ce qui est attendu.

Explication :
Lors de l'exécution d'un programme VB, le runtime utilise en interne un
paquet d'API's, donc il est probable que le dernier message d'erreur renvoyé
sera l'utilisation de l'API du runtime et non celle de l'API de notre
exécutable.

Pour contourner cet épineux problème, on utilisera la propriété LastDLLError
de l'objet Err.

Ce que dit l'aide VB sur LastDLLError :
-----------------------------------------------------------
Renvoie un code d'erreur système produit par un appel à unebibliothèque de
liaisons dynamiques (DLL). Propriété en lecture seule.

Remarques
La propriété LastDLLError s'applique uniquement aux appels aux DLL issues de
code Visual Basic. Lorsque ce type d'appel est effectué, la fonction appelée
renvoie généralement un code indiquant le succès ou l'échec. La propriété
LastDLLError est alors définie. Consultez la documentation relative aux
fonctions DLL pour déterminer quelles valeurs renvoyées indiquent un succès
ou un échec. Lors d'un échec, Visual Basic doit immédiatement vérifier la
propriété LastDLLError. Aucune exception n'est générée lorsque la propriété
LastDLLError est définie.
-----------------------------------------------------------


Courage !


Guy

" Teddy" a écrit dans le message de
news:
Bonjour,

Je cherche désespérément comment récupérer le code d'erreur retourné si


l'ouverture d'un
fichier documentaire avec le logiciel associé dans l'OS échoue avec l'API


ShellExecute.

S'il y a un problème, on n'a pas de remontée d'erreur dans Err.Number


apparemment.

D'autre part, si je cherche à ouvrir la messagerie par défaut avec l'API


ShellExecute en
mettant en tant que document à ouvrir la chaîne
"mailto:?subject=MonSujet&body=Corps-du-Message", ça


fonctionne bien avec
Outlook Express mais pas avec Outlook.

Outlook 2003 n'accepte peut-être pas ce genre de paramètre pourtant ça


marche lorsque
c'est dans un lien d'une page WEB.

Auriez vous une idée ?

Merci beaucoup.
Ted




Avatar
Teddy
Merci pour vos réponses.
Le code retourné par Err.LastDllError est une bonne solution.
Ca marche impeccable !

Teddy


" Teddy" a écrit dans le message de news:

Bonjour,

Je cherche désespérément comment récupérer le code d'erreur retourné si l'ouverture d'un
fichier documentaire avec le logiciel associé dans l'OS échoue avec l'API ShellExecute.

S'il y a un problème, on n'a pas de remontée d'erreur dans Err.Number apparemment.

D'autre part, si je cherche à ouvrir la messagerie par défaut avec l'API ShellExecute en
mettant en tant que document à ouvrir la chaîne
"mailto:?subject=MonSujet&body=Corps-du-Message", ça fonctionne bien
avec Outlook Express mais pas avec Outlook.

Outlook 2003 n'accepte peut-être pas ce genre de paramètre pourtant ça marche lorsque
c'est dans un lien d'une page WEB.

Auriez vous une idée ?

Merci beaucoup.
Ted