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 :

Comment fait-on quand une fonction d'API renvoie un buffer ?


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 513
    Points : 131
    Points
    131
    Par défaut Comment fait-on quand une fonction d'API renvoie un buffer ?
    Bonjour/bonsoir joyeux programmeurs.

    Je suis en train de me battre contre- enfin, avec - un programme C utilisant des API, et que je veux transposer en VB6. Et là, je tombe sur un bec !

    Un certain appel va me retourner un pointeur sur un buffer, soit que la fonction me le construise à la demande, soit que ec soit un buffer système. Mais à l'appel, je dois mettre un pointeur NULL !

    Je viens de trouver un tutoriel (ici même, d'ailleurs) qui dit que, même si, dans la déclaration de la fonction, le pointeur est spécifié "byref", dans l'appel de la fonction, on doit écrire "byval 0&" : je comprends parfaitement bien la logique : il faut bien que l'argument soit "0", et pas l'adresse d'une zone d e8 octets contenant des "0".

    Mais comment je récupère le buffer, après ?

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    type GUID 
      Data1 as long
      Data2 as integer
      Data3 as integer
      Data4[8] as byte
    end type
     
    public declare function LaFonctionDeLAPI lib "LAPI" (byref LeGUIDvoulu as GUID, byref Toto as Objet) as long
     
    ' J'arrive ici avec l'objet préparé dans MonObjet
     
    Err = LaFonctionDeLAPI(byval 0&, MonObjet)
    ...
    Ca ne peut pas être ça, il me manque le moyen de récupérer le GUID. mais je ne connais pas le moyen de résoudre ce problème en VB6.

    A l'aide !

    Merci d'avance.

    AMIcalement.

  2. #2
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 513
    Points : 131
    Points
    131
    Par défaut
    Je relance ce fil car je n'ai peut-être pas été assez clair : n'est-ce pas précisément la situation dans laquelle on va utiliser l'api CopyMemory ?

    Dans ce cas là, dans ma déclaration de la fonction LaFonctionDeLAPI, il ne faudra pas que je déclare "byref LeGuidVoulu as objet", mais "byval pGUID as long", puis que je me débrouille avec CopyMemory pour récupérer les données pointées par "pGUID" dans LeGUIDvoulu déclaré en VB6 par "dim LeGUIDvoulu as GUID".

    Le code serait alors :
    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
     
    type GUID 
      Data1 as long
      Data2 as integer
      Data3 as integer
      Data4[8] as byte
    end type
     
    dim LeGUIDvoulu as GUID, p as long
     
    public declare function LaFonctionDeLAPI lib "LAPI" (byval pointeur as long, byref Toto as Objet) as long
     
    ' J'arrive ici avec l'objet préparé dans MonObjet
     
    p=0
    Err = LaFonctionDeLAPI(p, MonObjet)
    CopyMemory(LeGUIDvoulu, p, 24)
    ...

    Est-ce que j'ai bon ?

    AMIcalement.

  3. #3
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 513
    Points : 131
    Points
    131
    Par défaut
    Je me réponds à moi-même : oui, c'est bien ça, à un minuscule détail près : la déclaration "byref LeGUIvoulu" est invalide (allez savoir pourquoi ???) Il faut déclarer "byval" (ou rien, c'est par défaut) la valeur que l'on obtient par "VapPtr(LeGUIvoulu)" (fonction non documentée dans VB6!!). C'est peut-être par honte des petits détails comme ça que µ$ a toujours refusé d'ouvrir le code de VB6...

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

Discussions similaires

  1. Quand une fonction est exécutée dans un programme ?
    Par sami2008 dans le forum Langage
    Réponses: 1
    Dernier message: 13/09/2009, 13h31
  2. comment passer un tableau à une fonction javascript
    Par beegees dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/03/2009, 19h48
  3. comment conecter un bouton à une fonction?
    Par Krishna dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 25/03/2008, 21h28
  4. Comment creer et appeler une fonction sql..
    Par denissay dans le forum Langage SQL
    Réponses: 7
    Dernier message: 05/01/2008, 22h28
  5. Réponses: 9
    Dernier message: 08/12/2004, 14h36

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