OVH Cloud OVH Cloud

Utilisation d'un pointeur renvoyé par une fonction API

8 réponses
Avatar
Archives
Bonsoir,

J'utilise une fonction API qui me renvoie un pointeur (de type Long) sur
une variable dont le type est personnalisé. Comment puis-je utiliser ce
pointeur pour lire une variable du même type ?

Par exemple:

Public type MonType
Var1 as integer
Var 2 as long
...
End Type

Public Dim MaVariable as MonType
Public Dim MonPointeur as Long
Declare MonAPI ...

MonPointeur=MonAPI(0)

Je souhaite ensuite lire le contenu de la variable de type MonType que la
fonction API a rempli.

Merci de vote aide

8 réponses

Avatar
François Picalausa
Hello,

Pourquoi ne pas passer la structure à l'API directement?
Declare MaFonction ...(..., MonParam As MonType, ...) ...
ou encore
Declare MaFonction ...(..., MonParam As Any, ...) ...
MaFonction (..., MaVariableMonType, ...)...

De cette manière, VB se charge de tout...
Sinon, il est possible d'utiliser l'API copymemory et remplir la structure,
mais il est toujours préférable de se asser de ce genre d'appels...

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Archives" a écrit dans le message de
news:ca4qua$ttd$
J'utilise une fonction API qui me renvoie un pointeur (de type Long)
sur une variable dont le type est personnalisé. Comment puis-je
utiliser ce pointeur pour lire une variable du même type ?

Par exemple:

Public type MonType
Var1 as integer
Var 2 as long
...
End Type

Public Dim MaVariable as MonType
Public Dim MonPointeur as Long
Declare MonAPI ...

MonPointeur=MonAPI(0)

Je souhaite ensuite lire le contenu de la variable de type MonType
que la fonction API a rempli.


Avatar
Archives
Pardonnez moi, j'ai du mal m'expliquer. Je n'ai pas créé la fonction API,
c'est une fonction fournie par MySQL. Je ne peux donc pas modifier la
déclaration qui est de la forme:

Declare Function mysql_init Lib "libmysql.dll" (byval pMySQL as Long) as
long


"François Picalausa" a écrit dans le message de news:

Hello,

Pourquoi ne pas passer la structure à l'API directement?
Declare MaFonction ...(..., MonParam As MonType, ...) ...
ou encore
Declare MaFonction ...(..., MonParam As Any, ...) ...
MaFonction (..., MaVariableMonType, ...)...

De cette manière, VB se charge de tout...
Sinon, il est possible d'utiliser l'API copymemory et remplir la


structure,
mais il est toujours préférable de se asser de ce genre d'appels...

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Archives" a écrit dans le message de
news:ca4qua$ttd$
> J'utilise une fonction API qui me renvoie un pointeur (de type Long)
> sur une variable dont le type est personnalisé. Comment puis-je
> utiliser ce pointeur pour lire une variable du même type ?
>
> Par exemple:
>
> Public type MonType
> Var1 as integer
> Var 2 as long
> ...
> End Type
>
> Public Dim MaVariable as MonType
> Public Dim MonPointeur as Long
> Declare MonAPI ...
>
> MonPointeur=MonAPI(0)
>
> Je souhaite ensuite lire le contenu de la variable de type MonType
> que la fonction API a rempli.




Avatar
Zoury
si j'ai bien compris, voici une façon de faire..

<non testé>
'***
Option Explicit

Private type MonType
Var1 as integer
Var 2 as long
...
End Type

Private Declare Function mysql_init _
Lib "libmysql.dll" _
( _
byval pMySQL as Long _
) as long

Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
ByRef pDst As Any, _
ByRef pSrc As Any, _
ByVal ByteLen As Long _
)

Private Sub Main()

Dim t as MonType

Call CopyMemory(t, ByVal mysql_init(0), LenB(t))

End Sub
'***

il est aussi possible comme l'a mentionnée François de jouer avec les
paramètres de CopyMemory afin de modifier sa méthode d'utilisation, en voici
quelques exemples :
'***
' signature typée
Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
ByRef pDst As MonType, _
ByVal pSrc As Long, _
ByVal ByteLen As Long _
)

'...
Call CopyMemory(t, mysql_init(0), LenB(t))
'***

'***
' pointeurs seulement..
Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
ByVal pDst As Long, _
ByVal pSrc As Long, _
ByVal ByteLen As Long _
) ' signature typée

'...
Call CopyMemory(VarPtr(t), mysql_init(0), LenB(t))
'***

etc..


--
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/

"Archives" a écrit dans le message de
news:ca4tbm$q6a$
Pardonnez moi, j'ai du mal m'expliquer. Je n'ai pas créé la fonction API,
c'est une fonction fournie par MySQL. Je ne peux donc pas modifier la
déclaration qui est de la forme:

Declare Function mysql_init Lib "libmysql.dll" (byval pMySQL as Long) as
long


"François Picalausa" a écrit dans le message de


news:

> Hello,
>
> Pourquoi ne pas passer la structure à l'API directement?
> Declare MaFonction ...(..., MonParam As MonType, ...) ...
> ou encore
> Declare MaFonction ...(..., MonParam As Any, ...) ...
> MaFonction (..., MaVariableMonType, ...)...
>
> De cette manière, VB se charge de tout...
> Sinon, il est possible d'utiliser l'API copymemory et remplir la
structure,
> mais il est toujours préférable de se asser de ce genre d'appels...
>
> --
> François Picalausa (MVP VB)
> http://faq.vb.free.fr --- http://msdn.microsoft.com
> http://apisvb.europe.webmatrixhosting.net
>
> "Archives" a écrit dans le message de
> news:ca4qua$ttd$
> > J'utilise une fonction API qui me renvoie un pointeur (de type Long)
> > sur une variable dont le type est personnalisé. Comment puis-je
> > utiliser ce pointeur pour lire une variable du même type ?
> >
> > Par exemple:
> >
> > Public type MonType
> > Var1 as integer
> > Var 2 as long
> > ...
> > End Type
> >
> > Public Dim MaVariable as MonType
> > Public Dim MonPointeur as Long
> > Declare MonAPI ...
> >
> > MonPointeur=MonAPI(0)
> >
> > Je souhaite ensuite lire le contenu de la variable de type MonType
> > que la fonction API a rempli.
>
>




Avatar
ng
Salut,

François dis moi pourquoi cet appel est-il déconseillé ?


Je sais, je suis pas Francois, mais je ne vois pas en quoi cela serait
déconseillé...

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/



Christophe <geo.ch@(wormfuck)tiscali.fr> a écrit :

Bonjour,
tu connais l'adresse de la structure et sa taille par un integer + 1
long, 2+4 octet
sous reserve que tu ais déclarer ta structure comme dans la dll.
tu peux utiliser copymemory et remplir la structure.

François dis moi pourquoi cet appel est-il déconseillé ?

D'une manière générale c'est assez mal foutu, car c'est plutôt à
l'API de charger la structure qu'on lui passe (comme indiqué dans le
prem. msg de François).

Christophe Vergon

"Archives" a écrit dans le message de
news: ca4tbm$q6a$
Pardonnez moi, j'ai du mal m'expliquer. Je n'ai pas créé la fonction
API, c'est une fonction fournie par MySQL. Je ne peux donc pas
modifier la déclaration qui est de la forme:

Declare Function mysql_init Lib "libmysql.dll" (byval pMySQL as
Long) as long


"François Picalausa" a écrit dans le message
de news:
Hello,

Pourquoi ne pas passer la structure à l'API directement?
Declare MaFonction ...(..., MonParam As MonType, ...) ...
ou encore
Declare MaFonction ...(..., MonParam As Any, ...) ...
MaFonction (..., MaVariableMonType, ...)...

De cette manière, VB se charge de tout...
Sinon, il est possible d'utiliser l'API copymemory et remplir la
structure, mais il est toujours préférable de se asser de ce genre
d'appels...

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Archives" a écrit dans le message de
news:ca4qua$ttd$
J'utilise une fonction API qui me renvoie un pointeur (de type
Long) sur une variable dont le type est personnalisé. Comment
puis-je utiliser ce pointeur pour lire une variable du même type ?

Par exemple:

Public type MonType
Var1 as integer
Var 2 as long
...
End Type

Public Dim MaVariable as MonType
Public Dim MonPointeur as Long
Declare MonAPI ...

MonPointeur=MonAPI(0)

Je souhaite ensuite lire le contenu de la variable de type MonType
que la fonction API a rempli.








Avatar
Christophe
Bonjour,
tu connais l'adresse de la structure et sa taille par un integer + 1 long,
2+4 octet
sous reserve que tu ais déclarer ta structure comme dans la dll.
tu peux utiliser copymemory et remplir la structure.

François dis moi pourquoi cet appel est-il déconseillé ?

D'une manière générale c'est assez mal foutu, car c'est plutôt à l'API de
charger la structure qu'on lui passe (comme indiqué dans le prem. msg de
François).

Christophe Vergon

"Archives" a écrit dans le message de news:
ca4tbm$q6a$
Pardonnez moi, j'ai du mal m'expliquer. Je n'ai pas créé la fonction API,
c'est une fonction fournie par MySQL. Je ne peux donc pas modifier la
déclaration qui est de la forme:

Declare Function mysql_init Lib "libmysql.dll" (byval pMySQL as Long) as
long


"François Picalausa" a écrit dans le message de


news:

> Hello,
>
> Pourquoi ne pas passer la structure à l'API directement?
> Declare MaFonction ...(..., MonParam As MonType, ...) ...
> ou encore
> Declare MaFonction ...(..., MonParam As Any, ...) ...
> MaFonction (..., MaVariableMonType, ...)...
>
> De cette manière, VB se charge de tout...
> Sinon, il est possible d'utiliser l'API copymemory et remplir la
structure,
> mais il est toujours préférable de se asser de ce genre d'appels...
>
> --
> François Picalausa (MVP VB)
> http://faq.vb.free.fr --- http://msdn.microsoft.com
> http://apisvb.europe.webmatrixhosting.net
>
> "Archives" a écrit dans le message de
> news:ca4qua$ttd$
> > J'utilise une fonction API qui me renvoie un pointeur (de type Long)
> > sur une variable dont le type est personnalisé. Comment puis-je
> > utiliser ce pointeur pour lire une variable du même type ?
> >
> > Par exemple:
> >
> > Public type MonType
> > Var1 as integer
> > Var 2 as long
> > ...
> > End Type
> >
> > Public Dim MaVariable as MonType
> > Public Dim MonPointeur as Long
> > Declare MonAPI ...
> >
> > MonPointeur=MonAPI(0)
> >
> > Je souhaite ensuite lire le contenu de la variable de type MonType
> > que la fonction API a rempli.
>
>




Avatar
Zoury
je sais, je suis pas François non plus.. :O)
mais je crois savoir ce qu'il veut dire..

> François dis moi pourquoi cet appel est-il déconseillé ?
Je sais, je suis pas Francois, mais je ne vois pas en quoi cela serait
déconseillé...



Notez qu'il n'a *jamais* dit que c'était *déconseillé*. Il a plutôt dit
qu'il était *préférable* de les éviter.

AMHA, ce qu'il veut dire par là c'est que si une fonction API te permet de
passer la structure directement en paramètre et non seulement son pointeur
alors tu éviteras du même coup un appel inutile à la fonction
RtlMoveMemory.. La copie se fait lors de la même opération.

--
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/
Avatar
Archives
Merci pour cette aide.

Néanmoins, en essayant aussi bien avec des byval que des byref, la fonction
CopyMemory me modifie
systématiquement le handle

Call CopyMemory(t, ByVal Handle, LenB(t))

Celà fait planter Access et je ne comprends pas pourquoi.


"Zoury" a écrit dans le message de news:

si j'ai bien compris, voici une façon de faire..

<non testé>
'***
Option Explicit

Private type MonType
Var1 as integer
Var 2 as long
...
End Type

Private Declare Function mysql_init _
Lib "libmysql.dll" _
( _
byval pMySQL as Long _
) as long

Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
ByRef pDst As Any, _
ByRef pSrc As Any, _
ByVal ByteLen As Long _
)

Private Sub Main()

Dim t as MonType

Call CopyMemory(t, ByVal mysql_init(0), LenB(t))

End Sub
'***

il est aussi possible comme l'a mentionnée François de jouer avec les
paramètres de CopyMemory afin de modifier sa méthode d'utilisation, en


voici
quelques exemples :
'***
' signature typée
Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
ByRef pDst As MonType, _
ByVal pSrc As Long, _
ByVal ByteLen As Long _
)

'...
Call CopyMemory(t, mysql_init(0), LenB(t))
'***

'***
' pointeurs seulement..
Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
ByVal pDst As Long, _
ByVal pSrc As Long, _
ByVal ByteLen As Long _
) ' signature typée

'...
Call CopyMemory(VarPtr(t), mysql_init(0), LenB(t))
'***

etc..


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic


Avatar
Zoury
Peut-on voir la partie de code qui concerne ton problème incluant les
déclarations d'APIs?


--
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/