Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
François Picalausa
Bonjour/soir,
Tu peux récupérer la bonne addresse via arrayptr qui renvoie un pointeur vers la structure safe_array (c'est bien ça Zoury?) http://support.microsoft.com/default.aspx?scid9824
"Christophe" a écrit dans le message de news:bo3soi$8gp$
Bonjour,
J'ai possé une question il y a qqs temps concernant la GDI, qq un m'à mis sur la voie en me parlant des buggs liés à l'API copymemory.
Pour ceux qui utilisent cette fonction , ne l'utiliser pas avec un tableau dimensionné dynamiquement.
Les tableaux dynamiques ont une particularité qui ne permet pas de les employer avec une api utilisant une adresse.
Dim a() as long Redim a(10)
a(0) n'est pas l'adresse de départ du tableau car les tab dynamiques sont précédés par une structure safe array avant les données.
Bon c'était juste comme ça en passant si ça peut aider....
Christophe Vergon
Bonjour/soir,
Tu peux récupérer la bonne addresse via arrayptr qui renvoie un pointeur
vers la structure safe_array (c'est bien ça Zoury?)
http://support.microsoft.com/default.aspx?scid9824
Tu peux récupérer la bonne addresse via arrayptr qui renvoie un pointeur vers la structure safe_array (c'est bien ça Zoury?) http://support.microsoft.com/default.aspx?scid9824
"Christophe" a écrit dans le message de news:bo3soi$8gp$
Bonjour,
J'ai possé une question il y a qqs temps concernant la GDI, qq un m'à mis sur la voie en me parlant des buggs liés à l'API copymemory.
Pour ceux qui utilisent cette fonction , ne l'utiliser pas avec un tableau dimensionné dynamiquement.
Les tableaux dynamiques ont une particularité qui ne permet pas de les employer avec une api utilisant une adresse.
Dim a() as long Redim a(10)
a(0) n'est pas l'adresse de départ du tableau car les tab dynamiques sont précédés par une structure safe array avant les données.
Bon c'était juste comme ça en passant si ça peut aider....
Christophe Vergon
Zoury
> Tu peux récupérer la bonne addresse via arrayptr qui renvoie un pointeur vers la structure safe_array (c'est bien ça Zoury?) http://support.microsoft.com/default.aspx?scid9824
Un pointeur vers le pointeur en fait... pour les tableaux de chaine ça fonctionne différemment je crois...
'*** Option Explicit
Private Declare Function VarPtrArray _ Lib "msvbvm60.dll" _ Alias "VarPtr" _ ( _ ByRef Var() As Any _ ) As Long
Private Declare Sub CopyMemory _ Lib "kernel32" _ Alias "RtlMoveMemory" _ ( _ ByRef pDst As Any, _ ByRef pSrc As Any, _ ByVal ByteLen As Long _ )
Private Sub Form_Load()
Dim i(5) As Long Dim lp As Long
' Renvoi le pointeur vers le pointeur du SAFEARRAY lp = VarPtrArray(i)
' Retrouve le pointeur vers le SAFEARRAY Call CopyMemory(lp, ByVal lp, LenB(lp)) Debug.Print "Adresse du SAFEARRAY : " & lp
' on peut écrire le tout sur une seule ligne.. Call CopyMemory(lp, ByVal VarPtrArray(i), LenB(lp)) Debug.Print "Adresse du SAFEARRAY : " & lp
' le bout de code suivant donne le même résultat ' ne fonctionne pas avec un tableau de String Debug.Print "Adresse du SAFEARRAY : " & Not Not i
Merci de poster les réponses au groupe afin d'en faire profiter à tous
> Tu peux récupérer la bonne addresse via arrayptr qui renvoie un pointeur
vers la structure safe_array (c'est bien ça Zoury?)
http://support.microsoft.com/default.aspx?scid9824
Un pointeur vers le pointeur en fait... pour les tableaux de chaine ça
fonctionne différemment je crois...
'***
Option Explicit
Private Declare Function VarPtrArray _
Lib "msvbvm60.dll" _
Alias "VarPtr" _
( _
ByRef Var() As Any _
) As Long
Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
ByRef pDst As Any, _
ByRef pSrc As Any, _
ByVal ByteLen As Long _
)
Private Sub Form_Load()
Dim i(5) As Long
Dim lp As Long
' Renvoi le pointeur vers le pointeur du SAFEARRAY
lp = VarPtrArray(i)
' Retrouve le pointeur vers le SAFEARRAY
Call CopyMemory(lp, ByVal lp, LenB(lp))
Debug.Print "Adresse du SAFEARRAY : " & lp
' on peut écrire le tout sur une seule ligne..
Call CopyMemory(lp, ByVal VarPtrArray(i), LenB(lp))
Debug.Print "Adresse du SAFEARRAY : " & lp
' le bout de code suivant donne le même résultat
' ne fonctionne pas avec un tableau de String
Debug.Print "Adresse du SAFEARRAY : " & Not Not i
> Tu peux récupérer la bonne addresse via arrayptr qui renvoie un pointeur vers la structure safe_array (c'est bien ça Zoury?) http://support.microsoft.com/default.aspx?scid9824
Un pointeur vers le pointeur en fait... pour les tableaux de chaine ça fonctionne différemment je crois...
'*** Option Explicit
Private Declare Function VarPtrArray _ Lib "msvbvm60.dll" _ Alias "VarPtr" _ ( _ ByRef Var() As Any _ ) As Long
Private Declare Sub CopyMemory _ Lib "kernel32" _ Alias "RtlMoveMemory" _ ( _ ByRef pDst As Any, _ ByRef pSrc As Any, _ ByVal ByteLen As Long _ )
Private Sub Form_Load()
Dim i(5) As Long Dim lp As Long
' Renvoi le pointeur vers le pointeur du SAFEARRAY lp = VarPtrArray(i)
' Retrouve le pointeur vers le SAFEARRAY Call CopyMemory(lp, ByVal lp, LenB(lp)) Debug.Print "Adresse du SAFEARRAY : " & lp
' on peut écrire le tout sur une seule ligne.. Call CopyMemory(lp, ByVal VarPtrArray(i), LenB(lp)) Debug.Print "Adresse du SAFEARRAY : " & lp
' le bout de code suivant donne le même résultat ' ne fonctionne pas avec un tableau de String Debug.Print "Adresse du SAFEARRAY : " & Not Not i
Merci de poster les réponses au groupe afin d'en faire profiter à tous
Christophe
Merci pour ces précisions
Christophe Vergon
"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de news:
> Tu peux récupérer la bonne addresse via arrayptr qui renvoie un pointeur > vers la structure safe_array (c'est bien ça Zoury?) > http://support.microsoft.com/default.aspx?scid9824
Un pointeur vers le pointeur en fait... pour les tableaux de chaine ça fonctionne différemment je crois...
'*** Option Explicit
Private Declare Function VarPtrArray _ Lib "msvbvm60.dll" _ Alias "VarPtr" _ ( _ ByRef Var() As Any _ ) As Long
Private Declare Sub CopyMemory _ Lib "kernel32" _ Alias "RtlMoveMemory" _ ( _ ByRef pDst As Any, _ ByRef pSrc As Any, _ ByVal ByteLen As Long _ )
Private Sub Form_Load()
Dim i(5) As Long Dim lp As Long
' Renvoi le pointeur vers le pointeur du SAFEARRAY lp = VarPtrArray(i)
' Retrouve le pointeur vers le SAFEARRAY Call CopyMemory(lp, ByVal lp, LenB(lp)) Debug.Print "Adresse du SAFEARRAY : " & lp
' on peut écrire le tout sur une seule ligne.. Call CopyMemory(lp, ByVal VarPtrArray(i), LenB(lp)) Debug.Print "Adresse du SAFEARRAY : " & lp
' le bout de code suivant donne le même résultat ' ne fonctionne pas avec un tableau de String Debug.Print "Adresse du SAFEARRAY : " & Not Not i
Merci de poster les réponses au groupe afin d'en faire profiter à tous
Merci pour ces précisions
Christophe Vergon
"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news: ej4Zc7hoDHA.2140@TK2MSFTNGP09.phx.gbl...
> Tu peux récupérer la bonne addresse via arrayptr qui renvoie un pointeur
> vers la structure safe_array (c'est bien ça Zoury?)
> http://support.microsoft.com/default.aspx?scid9824
Un pointeur vers le pointeur en fait... pour les tableaux de chaine ça
fonctionne différemment je crois...
'***
Option Explicit
Private Declare Function VarPtrArray _
Lib "msvbvm60.dll" _
Alias "VarPtr" _
( _
ByRef Var() As Any _
) As Long
Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
ByRef pDst As Any, _
ByRef pSrc As Any, _
ByVal ByteLen As Long _
)
Private Sub Form_Load()
Dim i(5) As Long
Dim lp As Long
' Renvoi le pointeur vers le pointeur du SAFEARRAY
lp = VarPtrArray(i)
' Retrouve le pointeur vers le SAFEARRAY
Call CopyMemory(lp, ByVal lp, LenB(lp))
Debug.Print "Adresse du SAFEARRAY : " & lp
' on peut écrire le tout sur une seule ligne..
Call CopyMemory(lp, ByVal VarPtrArray(i), LenB(lp))
Debug.Print "Adresse du SAFEARRAY : " & lp
' le bout de code suivant donne le même résultat
' ne fonctionne pas avec un tableau de String
Debug.Print "Adresse du SAFEARRAY : " & Not Not i
"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de news:
> Tu peux récupérer la bonne addresse via arrayptr qui renvoie un pointeur > vers la structure safe_array (c'est bien ça Zoury?) > http://support.microsoft.com/default.aspx?scid9824
Un pointeur vers le pointeur en fait... pour les tableaux de chaine ça fonctionne différemment je crois...
'*** Option Explicit
Private Declare Function VarPtrArray _ Lib "msvbvm60.dll" _ Alias "VarPtr" _ ( _ ByRef Var() As Any _ ) As Long
Private Declare Sub CopyMemory _ Lib "kernel32" _ Alias "RtlMoveMemory" _ ( _ ByRef pDst As Any, _ ByRef pSrc As Any, _ ByVal ByteLen As Long _ )
Private Sub Form_Load()
Dim i(5) As Long Dim lp As Long
' Renvoi le pointeur vers le pointeur du SAFEARRAY lp = VarPtrArray(i)
' Retrouve le pointeur vers le SAFEARRAY Call CopyMemory(lp, ByVal lp, LenB(lp)) Debug.Print "Adresse du SAFEARRAY : " & lp
' on peut écrire le tout sur une seule ligne.. Call CopyMemory(lp, ByVal VarPtrArray(i), LenB(lp)) Debug.Print "Adresse du SAFEARRAY : " & lp
' le bout de code suivant donne le même résultat ' ne fonctionne pas avec un tableau de String Debug.Print "Adresse du SAFEARRAY : " & Not Not i