Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Inscrit en
    mai 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 154
    Points : 48
    Points
    48

    Par défaut Appel de l'api WiFi : erreur non documentée

    Bonjour à tous.

    Je suis désolé de vous saouler, mais je n'arrive ni à avancer, ni à comprendre ce qui cloche...

    Je suis sous Windows 10 64 bits et VB 6. J'ai plusieurs programmes qui font appel à diverses API, et qui marchent nickel.

    Mais, avec WLanAPI, il n'y a rien à faire, et dès le premier appel : WlanOpenHandle.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Timer1_Timer()
    Dim Version As Long
    Dim negotiatedVersion As Long
    Dim clientHandle As Long
    Dim lastError As Long
    Dim pReserved As Long
        pReserved = 0
        clientHandle = 0
        Version = 2
        lastError = WlanOpenHandle(Version, ByVal pReserved, negotiatedVersion, clientHandle)
    .....
    Sachant que la fonction est déclarée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Public Declare Function WlanOpenHandle Lib "wlanapi" (dwClientVersion As Long, ByRef pReserved As Long, _
                         ByRef pdwNegotiatedVersion As Any, ByRef phClientHandle As Any) As Long
    L'appel me retourne LastERROR à 50 : “ERROR_NOT_SUPPORTED”.

    La dll WlanAPI.dll est bien dans c:\windows\sysWOW64, en version 10.0.17134.1. J'ai essayé en la déclarant avec le chemin complet : ça donne (comme prévu !) exactement le même résultat.

    J'ai le même résultat sur 3 postes... et pourtant, la gestion interne de Windows du WiFi marche tout à fait normalement : on ne peut pas imaginer qu'il utilise d'autres routines, n'est-ce pas ?

    Serait-il possible que la (toute nouvelle ?) api et VB 6 soient incompatibles ? Et quand cela serait, d'où pourrait venir l'incompatibilité ?

    Je suis dans des abîmes de perplexité : est-ce que VB 6 n'aurait pas tel ou tel droit pour s'adresser au système, pour adresser certaines zones de mémoire ?

    Au secours, aidez-moi, donnez-moi des idées de recherche, je n'en peux plus !!!!

    Merci d'avance.

    AMIcalement.

  2. #2
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    décembre 2004
    Messages
    4 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 4 799
    Points : 10 778
    Points
    10 778

    Par défaut

    Salut

    Essais de passer les variables negotiatedVersion et clientHandle de type attendu Any en Variant (voir sans typer, laisser VB ce débrouiller )
    ProgElecT
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  3. #3
    Membre du Club
    Inscrit en
    mai 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 154
    Points : 48
    Points
    48

    Par défaut

    Salut.

    Merci de ta tentative.

    Exactement le même résultat dans les deux cas.

    Encore des idées, SVP.

    AMIcalement.

  4. #4
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    décembre 2004
    Messages
    4 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 4 799
    Points : 10 778
    Points
    10 778

    Par défaut

    Arf

    Pourquoi dans l'appel à la fonction passes tu le 2ém paramètre en ByVal alors qu'il est attendu un ByRef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lastError = WlanOpenHandle(Version, ByVal pReserved, negotiatedVersion, clientHandle)
    Citation Envoyé par MSDN
    ByRef représente l'option par défaut et peut donc être implicite. ...
    Essais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lastError = WlanOpenHandle(ByVal Version, pReserved, negotiatedVersion, clientHandle)
    ProgElecT
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  5. #5
    Membre du Club
    Inscrit en
    mai 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 154
    Points : 48
    Points
    48

    Par défaut

    Bonsoir, et merci de répondre.

    Je passe le paramètre ByVak par ce qu'il doit être NULL. Je ne sais pas où j'ai vu cette façon de faire, mais je dois dire que je ne vois pas comment VB 6 pourrait faire autrement pour passer un pointyeur NULL. J'ai mis quelques lignes avant "pReserved = 0", mais j'ai aussi essayé "-1" et "&H8000000" sans aucun résultat.

    Je viens d'essayer d'enlever le "ByVal", et alors j'obtiens LastError=87, ce qui correspond bien à la doc : "pReserved is not NULL". Pour les deux autres valeurs ci-dessus, je ne me souviens plus si j'avais 87 ou 50, mais de toutes façon, ça ne marchait pas.

    Encore des idées, SVP.

    AMIcalement.

  6. #6
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    décembre 2004
    Messages
    4 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 4 799
    Points : 10 778
    Points
    10 778

    Par défaut

    Re re re re

    J'ai mis quelques lignes avant "pReserved = 0", mais j'ai aussi essayé "-1" et "&H8000000" sans aucun résultat.
    Il me semble bien que vbNull = 1
    ProgElecT
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  7. #7
    Membre du Club
    Inscrit en
    mai 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 154
    Points : 48
    Points
    48

    Par défaut

    Encore une fois MERCI, je me sens moins seul.

    Mais malheureusement, sans connaître personnellement la valeur binaire de vbNull, si je mets "preserved=0" dans le code que j'ai publié, j'obtiens le code retour "50", et "87" pour toutes les autres valeurs que j'ai essayées, savoir "-1", "1", "&h80000000". Je suis pret à faire d'autres essais, mais sans y croire, car la doc µ$ dit que le code 87 correspond à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ERROR_INVALID_PARAMETER                  	pdwNegotiatedVersion is NULL, phClientHandle is NULL, or pReserved is not NULL.
    J'ai l'impression d'avoir épuisé toutes mes idées de recherche. Pensez-vous que l'on puisse espérer une aide sur un forum µ$ ? En connaissez-vous ?

    Encore merci.

    AMIcalement.

  8. #8
    Membre du Club
    Inscrit en
    mai 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 154
    Points : 48
    Points
    48

    Par défaut

    En réfléchissant à mon problème, voici ce que je me dis : tant que j'ai de mauvais paramètres, je reste au début de la macro, qui teste la validité des paramètres. Comme ils sont mauvais, ça ne va pas plus loin, et elle me répond ce qui est prévu : code erreur 87.

    Si les paramètres sont bons, elle essaie d'aller plus loin. J'ai vu, dans les commentaires de mon ami Google sur tel ou tel "Dependencies Walker", que µ$ avait introduit des nouveautés dans la façon dont les DLL sont liées entre elles (je ne sais plus si ça date de Windows 10 ou d'avant). Est-il possible que VB 6 ne soit pas compatible avec ces nouveautés ? (Histoires de droit d'accès à des zones de mémoire, ou d'exécution de certaines portion de code, ou de chargement de certains fichiers, ou dieu sait...?)

    Je ne suis pas trop pointu sur les entrailles de Windows. Ça serait bien si quelqu'un pouvait m'éclairer.

    Merci d'avance.

    AMIcalement.

  9. #9
    Membre du Club
    Inscrit en
    mai 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 154
    Points : 48
    Points
    48

    Par défaut

    Incroyable ! Ahurissant ! Invraisemblable ! J'ai trouvé !!!!!!!!!

    Et c'était d'un bête...............!

    J'ai déclaré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public Declare Function WlanOpenHandle Lib "wlanapi" (dwClientVersion As Long, ByRef pReserved As Long, ...
    Et là, tout d'un coup, aujourd'hui, je ne sais pas pourquoi il me saute aux yeux qu'il fallait déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Declare Function WlanOpenHandle Lib "wlanapi" (ByVal dwClientVersion As Long, ...
    Et là, ça marche nickel...

    Eh, les gars, je ne suis pas doué, hein !

    Mais je l'avais montrée à tout le monde, ma déclaration...

    Avec toutes mes excuses pour les multiples déranxgements.

    AMIcalement

  10. #10
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    décembre 2004
    Messages
    4 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 4 799
    Points : 10 778
    Points
    10 778

    Par défaut

    Salut

    Tu débutes bien l'année, que je te souhaite bonne bien sûr.

    Citation Envoyé par MSDN
    ByRef représente l'option par défaut et peut donc être implicite. ...
    cela aurai dût nous mettre la puce à l'oreille, cela sous entendait qu'il ne fallait pas laisser l'option par défaut.
    On en apprend tous les jours.

    En tout cas, merci pour le suivit.
    ProgElecT
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  11. #11
    Membre du Club
    Inscrit en
    mai 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 154
    Points : 48
    Points
    48

    Par défaut

    Ah ben je suis bien déçu de m'être réjoui trop tôt : j'ai bien obtenu un code retour 0, mais ça ne marche pas quand-même.

    Pour être sûr de ne pas me perdre dans tout un fatras, j'ai créé un projet minimal, qui comporte une fenêtre pour deux messages,
    un module pour les déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Declare Function WlanOpenHandle Lib "wlanapi" (ByVal dwClientVersion As Long, ByRef pReserved As Long, _
                         ByRef pdwNegotiatedVersion, ByRef phClientHandle) As Long
    Public Declare Function WlanCloseHandle Lib "wlanapi" (ByVal hClientHandle As Long, ByRef pReserved As Long) As Long
     
    Public negotiatedVersion As Long
    Public ClientHandle As Long
    Public lastError As Long
    Public pReserved As Long
    et le formLoad pour la fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Form_Load()
        ' Ouverture du dialogue avec l'API
        pReserved = 0
        lastError = WlanOpenHandle(2&, ByVal pReserved, negotiatedVersion, ClientHandle)
        Text1.Text = "lastError = " + Format(lastError) + " - ClientHandle = " + Hex(ClientHandle) + _
                    " - NegociatedVersion = " + Hex(negotiatedVersion)
     
        lastError = WlanCloseHandle(ClientHandle, ByVal pReserved)
        Text2.Text = "CloseHandle : " + Format(lastError)
    End Sub
    Je ne sais pas le faire en images, mais le résultat est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Text1.Text = lastError = 0 - ClientHandle = 0 - NegociatedVersion = 0 
     
    Text2.text = CloseHandle : 87
    Peut-être que demain j'aurai une nouvelle illumination, mais ce soir, je suis sec !

    Peut-être pas vous...

    AMIcalement.

  12. #12
    Membre du Club
    Inscrit en
    mai 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 154
    Points : 48
    Points
    48

    Par défaut

    Si certains lisent encore ce fil... Pourtant, il me semble qu'il pourrait être très utile - du moins dans la mesure où il reste des développeurs en VB6...

    Oui, la nuit m'a porté conseil, une fois de plus : j'ai vu s'inscrire sur le tableau noir de mes (mauvais !) rêves le mot "VarPtr"

    En fait, je ne suis pas du tout sûr d'avoir bien tout compris, mais j'ai utilisé diverses combinaisons, jusqu'à ce que j'en trouve une qui marche : la voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub Timer1_Timer()
    Dim ret As Long
    Dim pNegotiatedVersion As Long, pClientHandle As Long
        Message.BackColor = vbWhite
        pNegotiatedVersion = VarPtr(negotiatedVersion)
        pClientHandle = VarPtr(ClientHandle)
        ' Ouverture du dialogue avec l'API
        pReserved = 0
        ret = WlanOpenHandle(2&, ByVal pReserved, pNegotiatedVersion, pClientHandle)
        If ret = 0 Then
            Message.BackColor = vbYellow
            Message.Text = "ClientHandle = " + Hex(ClientHandle) + _
                    " - NegociatedVersion = " + Hex(negotiatedVersion)
            ret = WlanCloseHandle(ClientHandle, ByVal pReserved)
            If ret = 0 Then
                Message.BackColor = vbGreen
            Else
                Interface(0).Text = ret
            End If
        Else
            Message.Text = Format(ret)
            Timer1.Enabled = False
        End If
    End Sub
    avec les déclarations de points d'entrée ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Public Declare Function WlanOpenHandle Lib "wlanapi" (ByVal dwClientVersion As Long, ByRef pReserved As Long, _
                         ByVal pdwNegotiatedVersion As Long, ByVal phClientHandle As Long) As Long
     
    Public Declare Function WlanCloseHandle Lib "wlanapi" (ByVal hClientHandle As Long, pReserved As Long) As Long
    Il semblerait qu'une croyance encore très répandue ne soit qu'une légende urbaine : les constantes dans les paramètres d'appels de fonction (en VB6) sont passées comme les autres par défaut, en "ByRef".

    A bon entendeur...

    AMIcalement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/09/2015, 17h25
  2. Erreur::l'appel de l'API 'ImportFile' a échoué
    Par siham-gh dans le forum Visual C++
    Réponses: 6
    Dernier message: 15/12/2011, 22h00
  3. erreur non trouvé "appel de procedure incorrect"
    Par Bruce Campbell dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/03/2010, 10h37
  4. Erreur : Non implémenté lors de l'appel d'un evenement
    Par pedouille dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 10/12/2005, 11h15
  5. Réponses: 6
    Dernier message: 21/06/2002, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo