OVH Cloud OVH Cloud

CopyMemory

3 réponses
Avatar
Christophe
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

3 réponses

Avatar
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

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"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


Avatar
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

End Sub
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
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

End Sub
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous