Erreur Shell

[Résolu]
Signaler
Messages postés
34
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
12 mai 2009
-
Messages postés
34
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
12 mai 2009
-
(Re) Bonjour a tous !

Voila mon problème :
quand j'execute un commande Shell sous VB6 pour créer un lecteur reseau tout va bien meme si le lecteur existe ; alors qu'evidement dans le console cette meme commande me donne une erreur !
Je voudrais donc pouvoir recuperer les erreur du Shell.

Voici comment je fais deja (ce qui marche pas) :
Public Sub MonterDisk()
Dim j As Integer'pour le compteur
Err.Clear 'on vide le fichier d'erreur
j = 90 'correspondra a Z (65 a A)
'on essai de monter le lecteur reseau avec la lettre Z
Shell "NET USE " & Chr(j) & ": [file://\\Poste-serveur\i \\Poste-serveur\i] /PERSISTENT:NO", vbHide
If Err.Number <> 0 And j > 65 Then  'si ca marche pas
j = j - 1 'on passe a la lettre precedente
Shell "NET USE " & Chr(j) & ": [file://\\Poste-serveur\i \\Poste-serveur\i] /PERSISTENT:NO", vbHide
End If
lettre = Chr(j) 'on enregistre la lettre dans la variable (string) eponime
End Sub

Le Err.Number retourne un numero d'erreur dans l'execution du programme, pas dans l'execution d'une commande Shell.
Shell retourne un double si tout va bien et zero si ca s'est mal passe ; hors la commande s'execute mais ne fonctionne pas !
Je voudrais donc un fonction du genre : Err.Shell, a la place de Err.Number

Merci encore pour votre aide Et a bientot
PS : J'ai trouve des topics relatif a ce meme probleme mais ils etaient assez ancient et sans réel solutions pour la plus part, donc je relance !
_____________________________________
La vie est trop courte pour la passer a haïre.

7 réponses

Messages postés
34
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
12 mai 2009

Ca y est j'ai trouvé une solution pour que le lecteur que je monte ai pas la meme lettre qu'un deja existant.
Voici donc :
Dans un Module je met ça en entête :
Private Declare Function GetLogicalDrives Lib "kernel32.dll" () As Long

Toujours dans un module je rajoute ca :
Function IsDrive(d As String) 'Pour savoir si un lecteur Existe d'apres une lettre
Dim res As Long, drv As Long
' A=0x00000001, B=0x00000002, C=0x00000004, ... d UCase(d): drv Asc(Left(d, 1)) - 65
 drv = 2 ^ drv
 res = GetLogicalDrives If (res And drv) <> 0 Then IsDrive True Else IsDrive False
 End Function

J'ajoute ensuite ça là ou c'est nécéssaire :
Dim strLettre As String
'pour parcoure l'alphabet de Z a A
For i = 90 To 65 Step -1
    strLettre = Chr(i)
    'puis on test chaque lettre pour savoir si un lecteur y correspond
    IfNot IsDrive(strLettre) Then
        'si il existe pas !
        Debug.Print "Pas de lecteur " & strLettre
        GoTo Connect
    Else
        'si il existe
        Debug.Print strLettre & " Existe"
    End If
Next i
Connect:
'on connecte le lecteur reseau d'apres la lettre non attribuee
Shell "NET USE " & strLettre & ": [file://\\Poste-serveur\i \\Poste-serveur\i] /PERSISTENT:NO", vbHide
lettre = strLettre 'on stoque la lettre pour qu'elle soit utilise par toutes les methodes qui en ont besoin

Voila tout ! J'éspére que ça en aidera d'autre.
Merci a tous a une prochaine
_____________________________________
La vie est trop courte pour la passer a haïre.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
"Shell retourne un double si tout va bien et zero si ca s'est mal passe "

Shell te renvoie le PID (identifiant de processus)
et rend la main avant que ce dernier ne soit terminé. Shelle ne peut donc en aucun cas renvoyer le code d'erreur...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
34
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
12 mai 2009

Bon j'ai ecris un message pour qu'il ne s'affiche pas ...
Je disais donc :

Tout d'abord merci pour la reponse

Seulement quand j'utilise la fonction 'ExecCmd' avec 'NET USE.exe' ça fonctionne mais rien ne se passe !
Je met donc ' ExecCmd "NET USE.exe Z: [file://\\Poste-serveur\i \\Poste-serveur\i] /PERSISTENT:NO" ' ça me génére une erreur.
Alors je voudrais que l'on m'explique comment utiliser 'ExecCmd' avec 'NET USE' pour qu'il me renvoie une erreur comme dans la console, et que je puisse utiliser cette erreur pour que je puisse essayer de monter un lecteur reseau avec une autre lettre.

Merci et a bientot.
Je vous tien au courant si y a du nouveau d'ici là.
__________________________________________
La vie est trop courte pour la passer a haïre.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
je dirais (pas testé)

ExecCmd "NET", "USE.exe Z: [file://poste-serveur/i \\Poste-serveur\i] /PERSISTENT:NO"

l'exe c'est NET
le reste ne sont que ses parametres

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
Renfield < "l'exe c'est NET le reste ne sont que ses parametres" Alors pourquoi mettre le ".EXE" derrière le USE ? Un p'tit coup de fatigue Rendfield ? Ca ne te ressemble pas ?

ExecCmd "NET.exe", "USE Z: \\Poste-serveur\i /PERSISTENT:NO"

Et moi je dirais surtout qu'il vaudrait mieux utiliser les API plutot que de lancer un NET USE pour établir une connexion à un partage réseau.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
Windows s'y retrouve, sans le .exe.

a part cela, oui, les APIs seraient surement plus indiquées... ou le lancement de .BAT, si tu veux pouvoir garder un peu de controle une fois l'appli compilée

Renfield
Admin CodeS-SourceS- MVP Visual Basic