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
Une adresse unique par espace de stockage - 2,4 ou 8 octets - String fixe ou non à part
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)
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
RAS : 2 adresses différentes pointant sur un SAFEARRAY
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())
Test3 : VarPtr et Tableau non redimensionable
Comportement inattendu : Une adresse unique pour tous les tableaux quelquesoit le type !!!
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())
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.
Une curiosité !
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"
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.
Partager