Utiliser une dll qui renvoie plusieurs valeurs ??

Programmation d'applications complexes
Yves Rouquier
Messages : 40
Inscription : mar. 23/mars/2004 10:23

Utiliser une dll qui renvoie plusieurs valeurs ??

Message 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 .
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Yves Rouquier
Messages : 40
Inscription : mar. 23/mars/2004 10:23

Message 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 !
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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
Yves Rouquier
Messages : 40
Inscription : mar. 23/mars/2004 10:23

Message 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.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

la userlib F64 ne peut elle pas t'aider ?
Image
Yves Rouquier
Messages : 40
Inscription : mar. 23/mars/2004 10:23

Message 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
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message 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.
Répondre