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

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    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 131
    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

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