Problème sous XP sp2

Programmation d'applications complexes
DominiqueB
Messages : 47
Inscription : sam. 01/mai/2004 14:41

Problème sous XP sp2

Message par DominiqueB »

Salut, j'utilise le code suivant pour lister tous les PC présent sur notre réseau local, ce code fonctionne bien sous w98se, sous w2k mais me retourne une liste vide sous xp sp2 !
Ya une bourde ou bien ?
Y aurait-il un paramètre spécifique sous xp sp2 pour autoriser un poste à parcourrir le réseau ?

Code : Tout sélectionner

;***********************************************************************************
; List all PC's name presents on the local network.
;***********************************************************************************
;   Params  : None
;   Return  : List of PC's names separated by a TAB, string
Global ListPC.s

Procedure EnumAll(*nr.NETRESOURCE) 
  tempnr.NETRESOURCE 
  hEnum.l 
  Entries.l 
  nSize.l 
  ec.l 
  x.l 
  j.l 
  Entries = -1 
  nSize = 65536 ;16384
  
  ec = WNetOpenEnum_(#RESOURCE_GLOBALNET, #RESOURCETYPE_ANY, #NULL, *nr, @hEnum) 
  *Buffer=AllocateMemory(nSize)
  ec = WNetEnumResource_(hEnum,@Entries,*Buffer,@nSize) 
  
  ;MessageRequester("Nb entrées: ", Str(Entries), 0)
  For x = 1 To Entries 
    j = (x-1)*SizeOf(NETRESOURCE) 
    tempnr\dwDisplayType  = PeekL(*Buffer+j+8) 
    tempnr\dwUsage        = PeekL(*Buffer+j+12) 
    tempnr\lpRemoteName   = PeekL(*Buffer+j+20) 
    RemoteName.s="" 
    
    If tempnr\lpRemoteName And (tempnr\dwDisplayType = #RESOURCEDISPLAYTYPE_SERVER)
      RemoteName = PeekS(tempnr\lpRemoteName)
      ListPC + RemoteName + Chr(9)
      ;MessageRequester("PC trouvé: ", ListPC, 0)
    EndIf
    
    If (tempnr\dwUsage & #RESOURCEUSAGE_CONTAINER) 
      EnumAll(tempnr) 
    EndIf 
  Next 
  
  WNetCloseEnum_(hEnum) 
EndProcedure

ProcedureDLL LitNet()
  ; Ici il faut remettre à vide cette chaine car elle est globale à la DLL et n'est donc créée
  ; qu'au chargement initial de la DLL. Sinon la liste ne fera que s'allonger à chaque appel en
  ; ne perdant pas son contenu !
  ListPC = ""
  EnumAll(#NULL)
  ListPC = Left(ListPC, Len(ListPC) - 1)
  ;MessageRequester("Liste des PCs: ", ListPC, 0)
  ProcedureReturn @ListPC
EndProcedure
Toute aide sera la bien venue !

Merci

Dominique
Dernière modification par DominiqueB le mer. 24/nov./2004 10:24, modifié 1 fois.
Dominique
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Salut Dominique


je n'ai pas de réponse toute faite mais je te conseille ceci (j'ai regardé ton code et la doc MS)


tu dois vérifier le résultats des API WNetOpenEnum et NetEnumResource avec la valeur NO_ERROR pour savoir si l'API a échouée ou non. Si le problème vient de là, tu recherche l'erreur.

Le résultat de WNetEnumResource doit aussi être testé avec ERROR_NO_MORE_ITEMS pour savoir si l'énumération est terminée.

et puis je pense que ce code est faux

Code : Tout sélectionner

If (tempnr\dwUsage And #RESOURCEUSAGE_CONTAINER) 
      EnumAll(tempnr) 
    EndIf 
Ca ne serait pas plutôt un & à la place du AND car c'est un test.

Code : Tout sélectionner

If tempnr\dwUsage & #RESOURCEUSAGE_CONTAINER
      EnumAll(tempnr) 
    EndIf 
DominiqueB
Messages : 47
Inscription : sam. 01/mai/2004 14:41

Merci

Message par DominiqueB »

En fait, voici la cause de l'erreur:
cen'est pas non plus du au firewall comme suggéré sur le forum anglais, il semble que se soit du à un comportement différent des 3 systèmes.
Il suffit de récupérer non pas une partie seulement de la structure tempnr mais en entier. Je penses que j'aurais eu le même résultat en utilisant un ZeroMemory_() sur le buffer mais (un oubli ?) cette fonction ne semble pas reconnu par notre cher PureBasic ?
Enfin voilà, il suffit de complèter le code plus haut par celui ci et tout roule !

Code : Tout sélectionner

    tempnr\dwScope        = PeekL(*Buffer+j+0) 
    tempnr\dwType         = PeekL(*Buffer+j+4) 
    tempnr\dwDisplayType  = PeekL(*Buffer+j+8) 
    tempnr\dwUsage        = PeekL(*Buffer+j+12) 
    tempnr\lpLocalName    = PeekL(*Buffer+j+16) 
    tempnr\lpRemoteName   = PeekL(*Buffer+j+20) 
    tempnr\lpComment      = PeekL(*Buffer+j+24) 
    tempnr\lpProvider     = PeekL(*Buffer+j+28)
Ce code marche maintenant sur les 3 systèmes à ma disposition: w98se, w2k et xp.

Merci de tes suggestions.
>> Ca ne serait pas plutôt un & à la place du AND car c'est un test.
Il me semble que non, le & est réservé aux et binaire, ici c'est un et logique que je fais.

Autrement, tu as surement raison pour les détections d'erreurs, mais de toute facon les utilisateurs de ce programme ne sauraient pas quoi en faire, alors . . .

Enfin merci de ta réaction rappide à mon appel à l'aide !

Dominique.
Dominique
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Les tests des résultats c'est pour afficher lorsqu'il y a une erreur dans une messagerequester par exemple, ça ne devrait pas arriver si le code est bon mais ca permet en cas d'erreur de la situer.

Maintenant pour le AND et le & teste le code suivant avec le debugger on
tu verras qu'avec ton code ce n'est que la valeur de tempnr\dwUsage qui compte et #RESOURCEUSAGE_CONTAINER ne sert à rien puisque #RESOURCEUSAGE_CONTAINER est une constante et toujours >0.

Donc pour l'expression tempnr\dwUsage and #RESOURCEUSAGE_CONTAINER

#RESOURCEUSAGE_CONTAINER est toujours vrai et tempnr\dwUsage sera faux s'il vaut 0 et vrai pour les autres valeurs

And
ET logique. Peut être utilisé pour combiner les résultats vrais ou faux des opérateurs de comparaison en donnant un résultat fixé comme indiqué dans la table ci-dessous.

LHS | RHS |Résultat ; si RHS est #RESOURCEUSAGE_CONTAINER
-----------------------
faux | faux | faux <-- cas impossible

faux | vrai | faux <-- cas possible

vrai | faux | faux <-- cas impossible

vrai | vrai | vrai <-- cas possible
Ce qui revient à dire que seul tempnr\dwUsage a de l'importance dans ton test.

Ton test avec le AND revient à ça

Code : Tout sélectionner

If tempnr\dwUsage 
tu pourras le vérifier en changeant dans le code d'essai la ligne If (i And #RESOURCEUSAGE_CONTAINER) par If i

Code : Tout sélectionner

If (i & #RESOURCEUSAGE_CONTAINER)
teste le bit b1 et retourne vrai si il est à 1


j'ai mis la deuxième série de code en commentaire, tu pourras tester les différences.

Code : Tout sélectionner

; pour info #RESOURCEUSAGE_CONTAINER = 2

For i = 0 To 100
   If (i And #RESOURCEUSAGE_CONTAINER) 
       compteur +1
       Debug i
       Debug "ok"
       Debug ""
   Else
       erreur + 1
       valeur = i
   EndIf 

Next i


Debug "le test a réussi "+Str(compteur) + " fois"

Debug ""

Debug "le test a échoué "+Str(erreur) + " fois pour i ="+Str(valeur ) 
; 
; 


; For i = 0 To 100
;    If (i & #RESOURCEUSAGE_CONTAINER) 
;        compteur +1
;        Debug i
;        Debug "ok"
;        Debug ""
;    Else
;        erreur + 1
;    EndIf 
; 
; Next i
; 
; 
; Debug "le test a réussi "+Str(compteur) + " fois"
; 
; Debug ""
; 
; Debug "le test a échoué "+Str(erreur) + " fois"
Dernière modification par Anonyme2 le mar. 23/nov./2004 19:59, modifié 1 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Denis a plus que raison, tu ne peux utiliser le And que pour tester des variables (et non des constantes) , pour que le résultat soit vrai, il faut que les deux variables soit différents de zéro (que les variables soient positives ou négatives n'a pas d'importance)

:)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Oui, entièrement d'accord
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

un ZeroMemory_() sur le buffer mais (un oubli ?) cette fonction ne semble pas reconnu par notre cher PureBasic ?
Elle est connue sous le nom de RtlZeroMemory_().
(Et moi aussi, je me demande bien ce que Radio-Télé Luxembourg vient faire là-dedans?)
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
DominiqueB
Messages : 47
Inscription : sam. 01/mai/2004 14:41

oops !

Message par DominiqueB »

Vous aviez raison, c'est bien le & que je dois employer !
C'est effectivement un et binaire que je dois faire.
La confusion vient du fait que c'est un code en PowerBasic que j'avais adapté à mes besoins, et pour ce langage c'est le and qui effectue ce et binaire !

Merci de vos éclairages !
Il faudra que je fasse attention la prochaine fois !

Dominique
Dominique
Répondre