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 :

[Trucs & Astuces]Quelques observations sur VarPtr and Co


Sujet :

VB 6 et antérieur

  1. #1
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut [Trucs & Astuces]Quelques observations sur VarPtr and Co
    Voici quelques constatations sur les fonctions de pointeurs non documentées sous VB
    qui peuvent éviter de se prendre la tête inutilement.


    Test1: VarPtr et constantes
    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
        Const k1  As Byte = 1
        Const k2 As Long = 2
        Const k3 As Double = 3
        Const k4 As Double = 3
        Const k5 As Integer = 3
        Const k6 As Long = 3
        Const k7 As String * 2 = "3"
        Const k8 As String = "3"
        Const k9 As String = "3"
     
        Me.Cls
        Me.Print
        Me.Print "Const k1  As Byte", VarPtr(k1)
        Me.Print "Const k2 As Long", VarPtr(k2)
        Me.Print "Const k3 As Double", VarPtr(k3)
        Me.Print "Const k4 As Double", VarPtr(k4)
        Me.Print "Const k5 As Integer", VarPtr(k5)
        Me.Print "Const k6 As Long", VarPtr(k6)
        Me.Print "Const k7 As String*", VarPtr(k7)
        Me.Print "Const k8 As String", VarPtr(k8)
        Me.Print "Const k9 As String", VarPtr(k9)
    Une adresse unique par espace de stockage - 2,4 ou 8 octets - String fixe ou non à part
    Stockage par id dentique aux énumérations !?
    Peut-être une voie pour modifier une constante en cours d'exécution ?


    Test2 : VarPtr et Tableau redimensionable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private declare function ArrPtr lib "msvbvm60" alias "varptr"(arr() as any)as long
     
    Dim myTab1() as long, myTab2() as long
    redim myTab1(5)
    redim myTab2(5)
     
    me.cls
    me.print arrptr(myTab1())
    me.print arrptr(myTab2())
    RAS : 2 adresses différentes pointant sur un SAFEARRAY


    Test3 : VarPtr et Tableau non redimensionable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private declare function ArrPtr lib "msvbvm60" alias "varptr"(arr() as any)as long
     
        Dim t1(5) As Integer, t2(1) As Long, t3(1) As Byte, t4(1) As Single, t5(1) As Double, t6(1) As Long, t7(1) As Integer
     
        Me.Cls
        Me.Print
        Me.Print "t1(5) As Int", ArrayPtr(t1())
        Me.Print "t2(1) As Lng", ArrayPtr(t2())
        Me.Print "t3(1) As Byt", ArrayPtr(t3())
        Me.Print "t4(1) As Sng", ArrayPtr(t4())
        Me.Print "t5(1) As Dbl", ArrayPtr(t5())
        Me.Print "t6(1) As Lng", ArrayPtr(t6())
        Me.Print "t7(1) As Int", ArrayPtr(t7())
    Comportement inattendu : Une adresse unique pour tous les tableaux quelquesoit le type !!!
    Eviter d'utiliser les pointeurs sur les tableaux prédimensionnés semble de bon sens ou utiliser des tableaux redimensionnables.


    Test4 : VarPtr<>StrPtr => ? ArrPtr<>ArrStrPtr
    Le traitement spécéifique des chaines de caractères sous VB nécessite l'utilisation d'une fonction spécifique StrPtr différente de VarPtr
    Il n'existe pas d'équivalent à StrPtr pour un tableau !
    Un lien intéressant pour solutionner proprement un pointeur pour tableaux de string :
    http://support.microsoft.com/kb/199824/fr
    => Librairie «VB6ptrlib» au format txt à renommer en tlb en pièce jointe

    Test5 : Un pointeur inattendu pas très catholique.
    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
    Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, RetVal As Any)
     
    Dim myTab1() as long, myTab2() as long,nn1 as long,nn2 as long
     
    me.cls
    redim myTab1(5) as long
    redim myTab2(5,2) as long
    nn1= Not (not myTab1())
    nn2= Not (not myTab2())
     
        Me.Print "Pointeur NotNot(myTab1()) nn1 : " & Format(nn1, "00 000 000"), "( <>" & ArrayPtr(myTab1()) & ")"
        Me.Print "Pointeur NotNot(myTab2()) nn2 : " & Format(nn2, "00 000 000"), "( <>" & ArrayPtr(myTab2()) & ")"
     
    dim headerInfos1(1) as integer,headerInfos2(1) as integer
    ' Copier uniquement les données voulues (mais cela pourrait-être l'intégralité d'un safearray)
    if nn1 then    GetMem4 nn1,headerInfos1(0)
    if nn2 then    GetMem4 nn2,headerInfos2(0)
        Me.print "Le tableau1 a " & headerInfos1(0) & " dim"
        Me.print "Le tableau2 a " & headerInfos2(0) & " dim"
    Une curiosité !
    Si Not vérifie le passage d'un type string, ce n'est apparemment pas le cas pour un array.
    Le second Not neutralise le 1er not afin de restaurer le valeur initiale.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Merci de partager tes découvertes.
    Petites ramarques avant que je continues à étudier le tout.
    Chez moi, ta déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private declare function ArrPtr lib "msvbvm60" alias "varptr"(arr() as any)as long
    ne fonctionne pas, Vb semble délicat avec la casse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private declare function ArrPtr lib "msvbvm60" alias "VarPtr"(arr() as any)as long
    fonctionne.

    Dans ton troisième exemple tu utilises ArrayPtr alors que ta declaration est ArrPtr
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  3. #3
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonjour Delbeke,
    C'est le problème quand on tape le code dans un editeur de texte

    Quelques enrichissements de ce topic devraient suivre.

  4. #4
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut Suite ...
    Le pointeur retourné par ArrPtr pointe vers l'adresse retournée par NotNot ;
    NotNot équivaut donc à Getmem4 byval ArrPtr(arr()), NotNot

    Si le pointeur d'un tableau fixe est commun à tous les tableaux,
    chaque tableau fixe est évidemment stocké à une adresse différente (encore heureux).
    Il importe donc de récupérer l'adresse et non le pointeur dans les cas particuliers énumérés précédemment.

    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
    15
    16
    17
    18
    ' UTILISATION INCORRECTE
    Dim t1(1) as long, t2(2) as long,ptr1 as long,ptr2 as long,adr1 as long,adr2 as long
     
    ptr1=arrptr(t1())
    ptr2=arrptr(t2())
    GetMem4 byval ptr1,adr1
    GetMem4 byval ptr2,adr2
    me.print ptr1,adr1
    me.print ptr2,adr2
     
    me.print
    ' UTILISATION CORRECTE
    ptr1=arrptr(t1())
    GetMem4 byval ptr1,adr1
    ptr2=arrptr(t2())
    GetMem4 byval ptr2,adr2
    me.print ptr1,adr1
    me.print ptr2,adr2
    Bon Week-end

  5. #5
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bon, vu les commentaires, ça ne passionne pas les foules
    mais tant qu'à ce que ce topic fournisse quelques informations de base utiles pour tous :

    VarPtr(String) pointe sur StrPtr(String) et
    VarPtr(Object) pointe sur ObjPtr(Object)
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim s as string, o as object, ptrS as long, ptrO as long
    ptrS=StrPtr(s) ' et
    ptrO=ObjPtr(o)
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    copymemory ptrS, byval VarPtr(s),4 ' et
    copymemory ptrO, byval VarPtr(o),4

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/02/2013, 13h25
  2. trucs et astuces XML
    Par grishka dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 09/09/2004, 13h56
  3. Quelques question sur Win 32 Appli
    Par lvdnono dans le forum Windows
    Réponses: 5
    Dernier message: 15/06/2004, 12h37
  4. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23

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