Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > InterBase
InterBase Forum d'entraide sur le SGBD InterBase de Codegear. Avant de poster -> F.A.Q Interbase, Tutoriels
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/07/2003, 03h23   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2002
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 26
Points : 10
Points : 10
Envoyer un message via MSN à Houben Jacques
Par défaut [résolu] Probléme avec UDF D6 et IB6

A l'aide d'une dll, j'ai créé une fonction en Delphi.
La déclaration comme fonction external se pase bien avec IB6.
Mais lors de de l'utilisation la valeur retournée est toujours zéro.
Voici le texte de la dll:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
uses
  SysUtils,
  Classes,
  math,
  ib_util IN 'C:\Program Files\Borland\InterBase\SDK\include\ib_util.pas';
 
//////  Convertir de deg,min eu deg,decimale  //1
 FUNCTION CvAngleDec(rAngle:double):double;
   var  rAngle_Ent,rAngle_Dec:real;
 
   begin
   rAngle_Dec:=abs(frac(rAngle))*10/6;
   rAngle_Ent:=floor( rAngle);
   IF rAngle<0 then result:=rAngle_ent+(1-rAngle_Dec)
   else
     result:=rAngle_ent + rAngle_Dec;
   end;
 
exports
 
CvAngleDec;
begin
end.
et la déclaration sous interbase

Code :
1
2
3
4
DECLARE EXTERNAL FUNCTION CVANGLEDEC
FLOAT
RETURNS FLOAT BY VALUE 
ENTRY_POINT 'CvAngleDec' MODULE_NAME 'angledll.dll';
Utilisation:

Code :
SELECT CVANGLEDEC(monChamp) FROM ma TABLE;
Domaine de monChamp : float

Le problème viendrait-il du fait que D6 n'a pas le type float ? Plusieurs essais ont été faits en modifiant les type ds la dll


Merci pour la réponse.

Message édité par Barbibulle :
Houben Jacques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2003, 12h59   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Par défaut Re: Probléme avec UDF D6 et IB6

Et si tu faisais plutot ca comme déclaration ?

Code :
1
2
3
4
DECLARE EXTERNAL FUNCTION CVANGLEDEC
DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE 
ENTRY_POINT 'CvAngleDec' MODULE_NAME 'angledll.dll';
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2003, 17h08   #3
Candidat au titre de Membre du Club
 
Inscription : avril 2002
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 26
Points : 10
Points : 10
Envoyer un message via MSN à Houben Jacques
Merci pour la réponse, mais ce n'est pas la solution.
Lacause doit se trouver vraisemblablement dans la construction de la dll. Car la réponse est toujours 0 ou un nombre du type ccccE-136 et cela pour toute les fonctions et quelque soit le type de la variable. ????
Houben Jacques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2003, 17h57   #4
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Par défaut Re: Probléme avec UDF D6 et IB6

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
uses
  SysUtils,
  Classes,
  math,
  ib_util IN 'C:\Program Files\Borland\InterBase\SDK\include\ib_util.pas';
 
//////  Convertir de deg,min eu deg,decimale  //1
 FUNCTION CvAngleDec(rAngle:double):double;cdecl;
   var  rAngle_Ent,rAngle_Dec:real;
 
   begin
   rAngle_Dec:=abs(frac(rAngle))*10/6;
   rAngle_Ent:=floor( rAngle);
   IF rAngle<0 then result:=rAngle_ent+(1-rAngle_Dec)
   else
     result:=rAngle_ent + rAngle_Dec;
   end;
 
exports
 
CvAngleDec;
begin
end.
tu as oublié un truc essentiel : le type d'appel autorisé pour ta fonction cdecl
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2003, 21h57   #5
Candidat au titre de Membre du Club
 
Inscription : avril 2002
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 26
Points : 10
Points : 10
Envoyer un message via MSN à Houben Jacques
Merci pour la proposition mais l'ajout de cdecl n'a rien modifié.
Avec stdcall (signalé dans InterBase Developer’s Guide), aucune amélioration non plus : la réponse est toujours du type cccccccE-316. ???
Houben Jacques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2003, 23h30   #6
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Par défaut Re: Probléme avec UDF D6 et IB6

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
uses
  SysUtils,
  Classes,
  math;
 
//////  Convertir de deg,min eu deg,decimale  //1
 FUNCTION CvAngleDec(Var rAngle:double):double;cdecl;
   var  rAngle_Ent,rAngle_Dec:real;
 
   begin
   rAngle_Dec:=abs(frac(rAngle))*10/6;
   rAngle_Ent:=floor( rAngle);
   IF rAngle<0 then result:=rAngle_ent+(1-rAngle_Dec)
   else
     result:=rAngle_ent + rAngle_Dec;
   end;
 
exports
 
CvAngleDec;
begin
end.
tu as oublié un autre truc var... A force ca va marcher
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2003, 09h06   #7
Candidat au titre de Membre du Club
 
Inscription : avril 2002
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 26
Points : 10
Points : 10
Envoyer un message via MSN à Houben Jacques
et oui.......ca marche.
Grand merci pour l'aide.
A noter que dans le Developer’sGuide p 74, il signale (pour c++) un type d'appel stdcall.
Je vais maintenant travailler avec des chaîne de caractères.
Houben Jacques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2003, 10h24   #8
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Oui tu as raison, mais j'ai vu dans un tuto qu'il fallait utiliser cdecl, n'ayant pas vu le paragraphe du guide du developpeur à se sujet, je ne me suis pas posé de question... (vue qu'avec cdecl ca fonctionnait)...

Du coup tu me fais poser des questions....

La seule différence entre StdCall et Cdecl c'est qu'avec Cdecl c'est l'appelant (donc interbase) qui doit nettoyer les paramètres stockées dans la pile une fois l'appel terminé.
Citation:
Envoyé par Dans l'aide Delphi est
La convention cdecl est utile pour les appels de fonctions à partir de bibliothèques partagées écrites en C ou en C++, alors que stdcall et safecall sont conservées habituellement pour les appels à du code externe. Sous Windows, les API du système d'exploitation sont stdcall et safecall. Les autres systèmes d'exploitation utilisent généralement cdecl. (Notez que stdcall est plus efficace que cdecl.)
Et d'apres ce que je comprend dans le ibase.h ils utilisent cdecl si on se trouve sous windows (autre que NT et donc autre que XP et Win2000) sinon si on se trouve sur une plateforme de type win32 ils utilisent stdcall.

Puisque tu as les mains dans le cambouis, peux tu faire un essai en mettant stdcall et venir nous dire si celà fonctionne correctement ? (A priori si tu es sous Win2000 ou NT ou XP ca devrait bien se passer)
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2003, 14h09   #9
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
J'écris tous mes dll pour mes UDF avec stdcall, je suis sous WinXP, et ça fonctionne bien.

Pour les chaînes de caractères, vas-tu utiliser string avec la librairie de delphi ou utiliser pchar ?
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2003, 14h26   #10
Candidat au titre de Membre du Club
 
Inscription : avril 2002
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 26
Points : 10
Points : 10
Envoyer un message via MSN à Houben Jacques
1) l'appel stdcall fonctionne également (Win XP).

2) Pour les chaînes de caractères voici une solution:
Code :
1
2
3
4
5
 
FUNCTION formaterUnReal (var n:double):Pchar; cdecl;
begin
result:=PChar(format('%7.4f',[n]));
end;
But: limiter le nombre de décimales dans une colonne d'une DBGrid
et la déclaration de la fonction:
Code :
1
2
3
4
5
 
DECLARE EXTERNAL FUNCTION FORMATERREAL
DOUBLE PRECISION
RETURNS CSTRING(15) CHARACTER SET ISO8859_1
ENTRY_POINT 'formaterUnReal' MODULE_NAME 'Angledll.dll';
Character set est-il utile ? Je ne sais pas
et encore merci pour l'aide.
A+
Houben Jacques est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h32.


 
 
 
 
Partenaires

Hébergement Web