Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utiliser une variable mémoire non managée

2 réponses
Avatar
ChC2B
Bonjour,

Dans le cadre de l'utilisation d'une API qui écrit dans une variable
passée j'ai une erreur de tentative d'écriture sur une mémoire protogée.
Exemple
Declare Function MoveToEx Lib "gdi32" (ByVaL hdc As Integer, ByVaL x As
Integer, ByVaL y As Integer, lpPoint As POINTAPI) As Integer

Dim ap(0) as pointapi

Movetoex( mhdc, ap(0).x,ap(0).y,ap(0)) ' erreur sur cette ligne

La solution qui marche c'est de déclarer une seconde variable ap1(0) et
d'écrire :

Movetoex( mhdc, ap(0).x,ap(0).y,ap1(0))

Mais cela ne me convient pas, je souhaite utiliser la variable Ap(0),
comment faire ?

A+

2 réponses

Avatar
Jérémy Jeanson
Bonjour ChC2B,

En fait ton souci viens de la ré-écriture que tu as fais de MoveToEx. Si tu
regarde dan la MSDN le dernier argument est un pointeur qui sert d.
http://msdn.microsoft.com/en-us/library/aa932127.aspx

Etant donnée qu'un pointeur ne peut être en même temps en entrée et en
sortie sur la même méthode, si tu veux utiliser ton écriture il n'y a pas de
secret : tu dois utiliser ta méthode en lui passant une seconde variable
(ap1 dans ton exemple). Puis ensuite reprendre la valeur de ap1 et la mettre
dans ap.
--
Jérémy JEANSON,
MCP

http://www.jjeanson.fr/

"ChC2B" a écrit dans le message de groupe de discussion :
4add518c$0$967$
Bonjour,

Dans le cadre de l'utilisation d'une API qui écrit dans une variable
passée j'ai une erreur de tentative d'écriture sur une mémoire protogée.
Exemple
Declare Function MoveToEx Lib "gdi32" (ByVaL hdc As Integer, ByVaL x As
Integer, ByVaL y As Integer, lpPoint As POINTAPI) As Integer

Dim ap(0) as pointapi

Movetoex( mhdc, ap(0).x,ap(0).y,ap(0)) ' erreur sur cette ligne

La solution qui marche c'est de déclarer une seconde variable ap1(0) et
d'écrire :

Movetoex( mhdc, ap(0).x,ap(0).y,ap1(0))

Mais cela ne me convient pas, je souhaite utiliser la variable Ap(0),
comment faire ?

A+


Avatar
ChC2B
Jérémy Jeanson a écrit :
Bonjour ChC2B,

En fait ton souci viens de la ré-écriture que tu as fais de MoveToEx.



Merci, en fait de ré-écriture j'ai juste changer le long en Integer car
j'avais un overflow avec la définition en Long. L'origine de ma question
était qu'en fait en VB6 une utilisation telle que ne posait pas de
problème, la première valeur du tableau étant passée comme adresse de
pointeur sur le tableau, il y avait ré-écriture des valeurs "par dessus"
par l'API sans que cela pose de problème. Globalement c'est pas le
movetoex qui me posait problème, mais le fait est que de nombreuses API
utilise ce genre de comportement (remplissage d'une valeur "retour" sur
un des paramètres de la fonction) donc avant de me lancer dans du plus
complexe je voulais avoir une idée du pourquoi.

Merci pour tout.
A+