Page 1 sur 1

Utiliser une dll qui renvoie plusieurs valeurs ??

Publié : mar. 07/sept./2004 13:41
par Yves Rouquier
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 .

Publié : mar. 07/sept./2004 14:40
par Le Soldat Inconnu
tu récupère l'adresse mem des valeurs ou pas

car si c'est le cas, un copymemory suffira pour transférer le résultat dans un variable pure

Publié : mar. 07/sept./2004 15:15
par Yves Rouquier
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 !

Publié : mar. 07/sept./2004 16:23
par Oliv
Je suis sur d'avoir déjà vu des personnes parler de ça, alors regarde sur le musée ou ce forum, peut-être sur celui anglais mais quelqu'un a déjà essayé avec cette DLL

Publié : mar. 07/sept./2004 17:55
par Yves Rouquier
En effet oui ! c'etait deja moi !

A l'epoque tu m'avais repondu que pb accepterai bientot les doubles .

je viens de reprendre les essais sur cette dll.

Publié : mar. 07/sept./2004 18:34
par Oliv
argh mince, pour les doubles c'est ce que j'ai lu, dans la prochaine version de PB, prévue pour la rentrée. Si c'est toi qui avait demandé je suis désolé :oops: :oops: :oops:

Publié : mar. 07/sept./2004 19:54
par Flype
la userlib F64 ne peut elle pas t'aider ?

Publié : mer. 08/sept./2004 13:01
par Yves Rouquier
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.

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

Publié : mer. 08/sept./2004 22:09
par hardy
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.