IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

InterBase Discussion :

Probléme avec UDF D6 et IB6


Sujet :

InterBase

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 26
    Points : 20
    Points
    20
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE EXTERNAL FUNCTION CVANGLEDEC
    FLOAT
    RETURNS FLOAT BY VALUE 
    ENTRY_POINT 'CvAngleDec' MODULE_NAME 'angledll.dll';
    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut Re: Probléme avec UDF D6 et IB6
    Et si tu faisais plutot ca comme déclaration ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE EXTERNAL FUNCTION CVANGLEDEC
    DOUBLE PRECISION
    RETURNS DOUBLE PRECISION BY VALUE 
    ENTRY_POINT 'CvAngleDec' MODULE_NAME 'angledll.dll';

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    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. ????

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut Re: Probléme avec UDF D6 et IB6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    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. ???

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut Re: Probléme avec UDF D6 et IB6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    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.

  8. #8
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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)

  9. #9
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    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 ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    1) l'appel stdcall fonctionne également (Win XP).

    2) Pour les chaînes de caractères voici une solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec les fonctions UDF
    Par sitaleb dans le forum Firebird
    Réponses: 3
    Dernier message: 01/03/2008, 11h57
  2. [IB6]Problème avec caractères accentués
    Par gandf dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/04/2007, 15h07
  3. [IB6]Problème avec caractères accentués
    Par gandf dans le forum InterBase
    Réponses: 5
    Dernier message: 07/04/2007, 10h43
  4. Problème avec une UDF
    Par kanmaber dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/08/2004, 23h42
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo