OVH Cloud OVH Cloud

utiliser une DLL écrite en Delphi

20 réponses
Avatar
jdd deschamps
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :

procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended); stdcall;

J'ai mis la DLL dans le répertoire de mon projet, et j'écris en VB :

Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)

puis dans le code : Call TerreRef(jd,...)

Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f

Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.


--
Pierre-Louis Deschamps
FAQ Visual Basic : http://faq.vb.free.fr/
Almicantarat : http://perso.wanadoo.fr/jdd.deschamps
Logiciel gratuit de navigation astronomique

10 réponses

1 2
Avatar
ng
Salut,

Je ne connais pas Delphi, a quoi correspond exactement le type extended (si
c'est un type) ?

Sinon si c'est du variant, j'aurais plutot fais ca :

Private Declare Sub TerreRef Lib "terredll.dll" (ByRef jd as variant, ByVal
x0 as variant, ByVal y0 as variant, ByVal z0 as variant, ByVal vx0 as
variant, ByVal vy0 as variant, ByVal vz0 As Variant)

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

jdd deschamps wrote:
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :

procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended);
stdcall;

J'ai mis la DLL dans le répertoire de mon projet, et j'écris en VB :

Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)

puis dans le code : Call TerreRef(jd,...)

Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f

Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.


Avatar
Patrice Henrio
Je crois que le type extended correspond au long (à vérifier) mais il me
parait évident qu'un type attendu ne peut pas être simplement transformer en
variant sous prétexte qu'il peut accepter n'importe quel type.
Il faut donner un type équivallent à extended c'est à dire un type occupant
le même nombre d'octets et de plus une méthode de lecture permettant de le
transformer du type VB au type delphi correspondant.

"jdd deschamps" a écrit dans le message de news:

J'ai récupéré une DLL dont j'ai la source. Il y est écrit :

procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended);
stdcall;

J'ai mis la DLL dans le répertoire de mon projet, et j'écris en VB :

Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)

puis dans le code : Call TerreRef(jd,...)

Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f

Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.


--
Pierre-Louis Deschamps
FAQ Visual Basic : http://faq.vb.free.fr/
Almicantarat : http://perso.wanadoo.fr/jdd.deschamps
Logiciel gratuit de navigation astronomique



Avatar
Jean-Marc
"ng" a écrit dans le message de
news:
Salut,

Je ne connais pas Delphi, a quoi correspond exactement le type extended


(si
c'est un type) ?

Sinon si c'est du variant, j'aurais plutot fais ca :

Private Declare Sub TerreRef Lib "terredll.dll" (ByRef jd as variant,


ByVal
x0 as variant, ByVal y0 as variant, ByVal z0 as variant, ByVal vx0 as
variant, ByVal vy0 as variant, ByVal vz0 As Variant)




Extended est un type de données, c'est un genre de super Double de la
mort, codé sur 10 octets (rien que ça...) et qui peut prendre des
valeurs assez intéressantes: de -3.4 * 10^4932 à + 1.1 * 10^4932 si
j'ai bien compris. Sais pas trop dans quoi mapper ça en fait. Je
suppose que le mieux c'est dans un double VB, mais suis pas sur que ça
colle cette affaire là...

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Patrick Philippot
jdd deschamps wrote:
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :

procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended);
stdcall;



Bonjour,

Le type extended de Delphi correspond à la spec IEEE-754 (extended
double precision type). Il n'a pas d'équivalent en Visual Basic. Si vous
maîtrisiez le code source Delphi (est-ce le cas?), vous pourriez
utiliser un double Delphi à la place de l'extended (avec évidemment une
perte de données si le nombre dépasse la capacité du Double). Il serait
compatible avec le Double de VB.

Tout ce que vous pouvez faire ici est de déclarer le prototype de la
fonction avec un type custom (structure) d'une taille de 10 octets et
d'appliquer ensuite sur ce buffer une routine de conversion vers un
Double (je n'en ai pas trouvé en VB). Mais l'intérêt d'une telle routine
serait limité dans le cas d'un dépassement de capacité du type Double. A
moins que vous ne décidiez de gérer cette structure vous même (auquel
cas, bon courage).

L'auteur de cette DLL n'a visiblement pas souhaité l'ouverture vers un
autre langage. Ou il a utilisé le type extended par inadvertance: les
cas où une telle capacité est nécessaire sont finalement assez rares.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrice Henrio
Ayant compris comment s'écrit l'extended, il suffit d'envoyer vers la DLL
une structure de 10 octets en plaçant dans chaque octet la valeur
représentant le nombre à passer.

Supposons que nous ne disposions que de structure sur un octet alors que
delphi souhaite un word (double octet), il faut comprendre,par exemple,
comment s'écrit 1 sur deux octets et créer un type de deux ocets
type 2octets
fort as byte
faible as byte
end type

Function PasserOctetsA2Octets(N as byte, M as byte) as 2octets
PasserOctetsA2Octets.fort=N
PasserOctetsA2Octets.faible=M
end function

Pour une fonction utilisant le nombre 1 comme word on aurait

F(PasserA2octets(0,1))


Je ne sais pas si ça marche, mais c'est l'idée que je développerai.

"Patrick Philippot" a écrit dans le
message de news:
jdd deschamps wrote:
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :

procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended);
stdcall;



Bonjour,

Le type extended de Delphi correspond à la spec IEEE-754 (extended double
precision type). Il n'a pas d'équivalent en Visual Basic. Si vous
maîtrisiez le code source Delphi (est-ce le cas?), vous pourriez utiliser
un double Delphi à la place de l'extended (avec évidemment une perte de
données si le nombre dépasse la capacité du Double). Il serait compatible
avec le Double de VB.

Tout ce que vous pouvez faire ici est de déclarer le prototype de la
fonction avec un type custom (structure) d'une taille de 10 octets et
d'appliquer ensuite sur ce buffer une routine de conversion vers un Double
(je n'en ai pas trouvé en VB). Mais l'intérêt d'une telle routine serait
limité dans le cas d'un dépassement de capacité du type Double. A moins
que vous ne décidiez de gérer cette structure vous même (auquel cas, bon
courage).

L'auteur de cette DLL n'a visiblement pas souhaité l'ouverture vers un
autre langage. Ou il a utilisé le type extended par inadvertance: les cas
où une telle capacité est nécessaire sont finalement assez rares.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr



Avatar
jdd deschamps
> L'auteur de cette DLL n'a visiblement pas souhaité l'ouverture vers un
autre langage. Ou il a utilisé le type extended par inadvertance: les
cas où une telle capacité est nécessaire sont finalement assez rares.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr



Il ne devait pas connaître le VB. C'est pour des calculs de coordonnées
astronomiques, ce qui explique son choix de l'"extended".
Avatar
jdd deschamps
Je vous remercie de vos réponses. Je comprends maintenant pourquoi le
logiciel plantait.
Comme la conversion de données Extended vers un Double semble délicate, je
vais plutôt récupérer le code source de la DLL et le réécrire en VB. Ca va
prendre du temps mais peut-être moins que de tenter d'utiliser la DLL telle
qu'elle existe.


--
Pierre-Louis Deschamps
FAQ Visual Basic : http://faq.vb.free.fr/
Almicantarat : http://perso.wanadoo.fr/jdd.deschamps
Logiciel gratuit de navigation astronomique

"jdd deschamps" a écrit dans le message de
news:
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :

procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended);


stdcall;

J'ai mis la DLL dans le répertoire de mon projet, et j'écris en VB :

Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)

puis dans le code : Call TerreRef(jd,...)

Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f

Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.


--
Pierre-Louis Deschamps
FAQ Visual Basic : http://faq.vb.free.fr/
Almicantarat : http://perso.wanadoo.fr/jdd.deschamps
Logiciel gratuit de navigation astronomique



Avatar
YannX
"jdd deschamps" a écrit dans le message de
news:epe$$
Je vous remercie de vos réponses. Je comprends maintenant pourquoi le
logiciel plantait.
Comme la conversion de données Extended vers un Double semble délicate, je
vais plutôt récupérer le code source de la DLL et le réécrire en VB. Ca va
prendre du temps mais peut-être moins que de tenter d'utiliser la DLL


telle
qu'elle existe.



Si tu as acces au code source de la DLL,
il suffit de modifier le type de sortie en celui qui va bien
et de la recompiler (en Delphi : quelle version ?, pas difficile a trouver).

Du borland, cela se trouve......
@+
Avatar
jdd deschamps
Pas bête. Du Delphi 4 apparamment. J'ai un ami qui bosse en Delphi, je vais
lui demander quelle version il utilise et s'il peut me faire ça.

Si tu as acces au code source de la DLL,
il suffit de modifier le type de sortie en celui qui va bien
et de la recompiler (en Delphi : quelle version ?, pas difficile a


trouver).

Du borland, cela se trouve......
@+







Avatar
YannX
> Pas bête.


Merci ;-) je rigole

Du Delphi 4 apparamment. J'ai un ami qui bosse en Delphi, je vais
lui demander quelle version il utilise et s'il peut me faire ça.



Tu peux meme lui simplifier le travail :
demande-lui juste de te compiler un "wrapper"
Cela lui evitera tout tracas (et a toi aussi, si jamais il y a une mise a
jour !)

// bon mon pascal a ete bcp oublié, mais l'idee est de convertir/ transtyper
avant l'appel !
procedure BTerreRef(jdb:double;var x0b,y0b,z0b,vx0,bvy0b,vz0b:double)
jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended
begin
jd = extended(jdb) ;
..........
procedure TerreRef(jd, x0,y0,z0,vx0,vy0,vz0);


end.
// dans une DLL accessoire...


> Si tu as acces au code source de la DLL,
> il suffit de modifier le type de sortie en celui qui va bien
> et de la recompiler (en Delphi : quelle version ?, pas difficile a
trouver).
>
> Du borland, cela se trouve......
> @+


1 2