LucyUnDemi
Messages postés34Date d'inscriptionmardi 18 décembre 2007StatutMembreDernière intervention12 mai 2009
-
5 févr. 2008 à 12:08
LucyUnDemi
Messages postés34Date d'inscriptionmardi 18 décembre 2007StatutMembreDernière intervention12 mai 2009
-
6 févr. 2008 à 17:17
(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.
LucyUnDemi
Messages postés34Date d'inscriptionmardi 18 décembre 2007StatutMembreDernière intervention12 mai 2009 6 févr. 2008 à 17:17
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.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 5 févr. 2008 à 14:32
"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...
LucyUnDemi
Messages postés34Date d'inscriptionmardi 18 décembre 2007StatutMembreDernière intervention12 mai 2009 5 févr. 2008 à 14:38
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Kristof_Koder
Messages postés918Date d'inscriptionvendredi 3 août 2007StatutMembreDernière intervention27 octobre 200810 5 févr. 2008 à 15:35
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 ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 5 févr. 2008 à 15:38
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