IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

VB 6 et antérieur Discussion :

Partager des structures d'une API


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    506
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 506
    Points : 131
    Points
    131
    Par défaut Partager des structures d'une API
    Re-bonjour à tous.

    Je viens préciser mes précédentes demandes, en espérant que ceux qui veulent bien me lire comprenne bien mon problème.

    J'ai trouvé sur Internet le source d'un exemple de programme qui utilise l'API WinLanAPI de Windows. Dans cet exemple, j'ai trouvé la structure suivante :
    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
     Type WLAN_AVAILABLE_NETWORK
       strProfileName               As String * WLAN_MAX_NAME_LENGTH '
       dot11Ssid                    As Long 'DOT11_SSID                  
       dot11BssType                 As Long 'DOT11_BSS_TYPE          
       uNumberOfBssids              As Long                          
       bNetworkConnectable          As Byte                          
       wlanNotConnectableReason     As Long                          
       uNumberOfPhyTypes            As Long                         
       dot11PhyTypes(8)             As Long ' DOT11_PHY_TYPE         
       bMorePhyTypes                As Byte                          
       wlanSignalQuality            As Long                          
       bSecurityEnabled             As Byte                         
       dot11DefaultAuthAlgorithm    As Long ' DOT11_AUTH_ALGORITHM  
       dot11DefaultCipherAlgorithm  As Long ' DOT11_CIPHER_ALGORITHM 
       dwFlags                      As Long                          
       dwReserved                   As Long                          
    End Type
    Pour bien souligner le problème, j'attire l'attention des lecteurs sur le fait que cette structure mélange un string* (la longueur est 256), des long et des byte.

    Si je veux utiliser cette API en VB6, je vais devoir recopier ce bloc mémoire dans mon "espace VB6", et retrouver mes petits (string, longs et bytes) dans le résultat.

    En espérant résoudre ce problème, j'ai fait une recherche sur le thème de l'alignement dans les API windows, et j'ai trouvé ça :
    The compiler uses these rules for structure alignment:

    Unless overridden with __declspec(align(#)), the alignment of a scalar structure member is the minimum of its size and the current packing.

    Unless overridden with __declspec(align(#)), the alignment of a structure is the maximum of the individual alignments of its member(s).

    A structure member is placed at an offset from the start of its parent structure which is the smallest multiple of its alignment greater than or equal to the offset of the end of the previous member.

    The size of a structure is the smallest multiple of its alignment greater than or equal to the offset of the end of its last member.

    __declspec(align(#)) can only increase alignment restrictions.
    J'ai envie d'en déduire que, dans la structure ci-dessus, chaque "byte" est, en fait, suivi de 3 (ou 7 ???) octets inutilisés. et que l'espace mémoire alloué à la structure est d'autant plus grand.

    L'objet de ce message est de demander aux habitués de ce forum de me faire part de leur expérience en la matière.

    Qu'ils soient par avance remerciés de leur contribution.

    Et je souhaite de joyeuses fêtes à tous.

    AMIcalement.

  2. #2
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 187
    Points
    17 187
    Par défaut
    Salut

    Je ne suis pas sûr que cela t'aidera, mais dans le doute ....
    Dans un premier temps, exemple de l'utilisation d'un type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'la fonction qui va utiliser le type BrowseInfo
    Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
    ' la définition du type
    Private Type BrowseInfo
      hWndOwner      As Long
      pIDLRoot       As Long
      pszDisplayName As Long
      lpszTitle      As Long
      ulFlags        As Long
      lpfnCallback   As Long
      lParam         As Long
      iImage         As Long
    End Type
    L'appel à la fonction public
    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
    25
    26
    27
    28
    29
    30
    Public Function BrowseForFolder(owner As Form, Title As String, StartDir As String) As String
      'Opens a Treeview control that displays the directories in a computer
      'Ouvre un contrôle Treeview qui affiche les répertoires d'un ordinateur
     
      Dim lpIDList As Long
      Dim szTitle As String
      Dim sBuffer As String
      Dim tBrowseInfo As BrowseInfo
      m_CurrentDirectory = StartDir & vbNullChar
     
      szTitle = Title
      With tBrowseInfo
        .hWndOwner = owner.hWnd
        .lpszTitle = lstrcat(szTitle, "")
        .ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN + BIF_STATUSTEXT
        'get address of function.       obtenir l'adresse de la fonction.
        .lpfnCallback = GetAddressofFunction(AddressOf BrowseCallbackProc)
      End With
     
      lpIDList = SHBrowseForFolder(tBrowseInfo)
      If (lpIDList) Then
        sBuffer = Space(MAX_PATH)
        SHGetPathFromIDList lpIDList, sBuffer
        sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
        BrowseForFolder = sBuffer
      Else
        BrowseForFolder = ""
      End If
     
    End Function
    Comme tu peux le voir la variable tBrowseInfo de type BrowseInfo est rempli dans la boucle With ... End With .

    Pour éventuellement continuer à t'aider, peux tu mettre la déclaration de la fonction API utilisant ce type WLAN_AVAILABLE_NETWORK, entendu que cette fonction de l'api te renvoie? le type ou attend? le type WLAN_AVAILABLE_NETWORK.
    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.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase 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.
    👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    506
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 506
    Points : 131
    Points
    131
    Par défaut
    Ben merci, Prog_Elect, mais, en effet, ça ne m'aide pas, car mon problème est situé un cran plus loin : d'abord, with...end with n'est pas une boucle, mais ça n'est qu'un détail. Je sais appeler une API, et gérer un type fait de huit "long" adressé par son pointeur (à l'aller ou au retour).

    Si tu m'as bien lu, ici, mon problème vient de ce que le type déclaré pour l'API mélange des "long" avec un "byte" de temps en temps. Ma question était : est-il confirmé que dans ce cas, Windows (et non pas Visual Basic, hein !) place trois (7 ?)"byte" de plus derrière celui qui est déclaré, afin de retomber sur une adresse multiple de 4 (8 ?) pour le "long" suivant.

    Il me restera (éventuellement) à gérer l'inversion de l'ordre des "byte" par Visual Basic, qui stocke un "dim a(3) as byte dans l'ordre 3,2,1,0...

    Merci d'avoir répondu.

    Joyeuses fêtes.

    AMIcalement.

Discussions similaires

  1. [WD14] Passage de Structure depuis une API
    Par SavageBeast dans le forum WinDev
    Réponses: 1
    Dernier message: 09/09/2013, 15h18
  2. [Débutant] Partage des sources d'une application (SVN?)
    Par Alterans dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 16/07/2013, 17h41
  3. Réponses: 6
    Dernier message: 15/04/2013, 11h11
  4. construire un jar à partir des sources d'une API
    Par Phonatacid dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 20/09/2010, 12h12
  5. utilisation des structures dans une interface
    Par ralf91 dans le forum C#
    Réponses: 5
    Dernier message: 22/01/2010, 16h55

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