Utiliser une dll qui renvoie plusieurs valeurs ??
-
- Messages : 40
- Inscription : mar. 23/mars/2004 10:23
Utiliser une dll qui renvoie plusieurs valeurs ??
Bonjour.
je cherche à utiliser la dll de conversion de coordonnée géographique de Bruno BASLI wdgps.dll
Mais j'ais plusieurs problemes :
1- la dll utilise des variables doubles.
(Utilisation de la lib F64 pas encore trés claire pour moi ! )
2-La plupart des fonctions de la dll renvoient plusieurs variables
Là je ne vois pas comment coder pour retrouver mes variables
Peut être lire directement en mémoire ?
Si vous avez l'experience sur l'utilisation de ce type de dll en Pure (exemple de code ,methodes et syntaxe etc ...)
Merci .
je cherche à utiliser la dll de conversion de coordonnée géographique de Bruno BASLI wdgps.dll
Mais j'ais plusieurs problemes :
1- la dll utilise des variables doubles.
(Utilisation de la lib F64 pas encore trés claire pour moi ! )
2-La plupart des fonctions de la dll renvoient plusieurs variables
Là je ne vois pas comment coder pour retrouver mes variables
Peut être lire directement en mémoire ?
Si vous avez l'experience sur l'utilisation de ce type de dll en Pure (exemple de code ,methodes et syntaxe etc ...)
Merci .
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
-
- Messages : 40
- Inscription : mar. 23/mars/2004 10:23
Non je ne pense pas .Ce sont des variables doubles qui sont retournées.
Voir des exemples en plusieurs languages ici :
http://www.wdgps.com/wdgps/
Beaucoup de languages , mais pas Purebasic !
Voir des exemples en plusieurs languages ici :
http://www.wdgps.com/wdgps/
Beaucoup de languages , mais pas Purebasic !
-
- Messages : 40
- Inscription : mar. 23/mars/2004 10:23
-
- Messages : 40
- Inscription : mar. 23/mars/2004 10:23
Bonjour !
Apres une demi journée de recherche forum anglais etc
j'ais enfin la solution : c'est une combinaison d'utilisation
de structure et de la lib f64 .
J'esperes que cette exemple vous sera util.
Apres une demi journée de recherche forum anglais etc
j'ais enfin la solution : c'est une combinaison d'utilisation
de structure et de la lib f64 .
J'esperes que cette exemple vous sera util.
Code : Tout sélectionner
wdgps_lib = 1
Structure VarDouble
Hi.l
Lo.l
EndStructure
Procedure MakeVarDouble(LONG.f, ADDRESS.l)
!FLD dword [ Esp ]
!MOV dword Eax, [ Esp + 4 ]
!FSTP qword [ Eax ]
EndProcedure
If OpenLibrary(#wdgps_lib,"wdgps.dll")
d_lat.VarDouble ; declaration des variable d'entrée d_lat et d_lon avec la structure VarDouble
d_lon.VarDouble
lat.f = 45 ; declaration en variable float pour l'utilisation dans purebasic
lon.f = 5
x.double ; déclaration des variables de retour de la dll avec le ".double" de la lib F64
y.double
MakeVarDouble(lat,@d_lat) ; Construction des variables doubles à partir des floats
MakeVarDouble(lon,@d_lon) ; (pour entrée dans la fonction de la dll)
; Modele d'une des fonctions de la dll
; LatLon_WGS84_2_LT2 ( latitude[double], longitude[double], &x[double], &y[double])
; on voie ici que normalement il y a 2 arguments doubles a passer a la dll et en retour (&) 2 autres doubles
; dans notre cas les arguments d'entrée sont décomposés en parties de poids fort et poids faible.
; pour les variables de retour on indique l'adresse memoire a la fonction de la dll
CallCFunction(#wdgps_lib , "LatLon_WGS84_2_LT2", d_lat\Hi , d_lat\Lo , d_lon\Hi , d_lon\Lo , @x , @y)
Debug F64_toFloat(x) ; consersion des variables de retour doubles en float
Debug F64_toFloat(y)
Else
MessageRequester("info","Impossible d'ouvrir la dll wdgps.dll")
End
EndIf
CloseLibrary(#wdgps_lib)
End
De retour de vacances !

Effectivement, j'ai déjà eu à faire au problème de variable d'entrée 64bits (dans la lib advapi32.dll)
En fait quand la fonction attend un double, il faut lui passer deux variables (long), correspondant aux parties "hautes" et "basses".
Pourquoi ça marche?
Si PB met à la suite dans une zone mémoire contigüe toutes les variables d'entrée et communique à la dll l'adresse de la zone, c'est normal.
Mais est-ce ainsi qu'il procède? Je ne sais pas.


Effectivement, j'ai déjà eu à faire au problème de variable d'entrée 64bits (dans la lib advapi32.dll)
En fait quand la fonction attend un double, il faut lui passer deux variables (long), correspondant aux parties "hautes" et "basses".
Pourquoi ça marche?
Si PB met à la suite dans une zone mémoire contigüe toutes les variables d'entrée et communique à la dll l'adresse de la zone, c'est normal.
Mais est-ce ainsi qu'il procède? Je ne sais pas.