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

 Delphi Discussion :

Problème de création d'udf


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 717
    Par défaut Problème de création d'udf
    bonjour a tous !
    voici le code de ma dll que je compte utiliser sous firebird comme udf :

    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
    library Madll;
     
    uses
      SysUtils,
      windows,
      Classes;
     
    {$R *.res}
     
    function ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util.dll';
     
    function ChangeMyString(const p: PChar): PChar; cdecl;
    var
    nomfichier: string;
    begin
    nomfichier := extractfilename(string(p));
    Result := ib_util_malloc(Length(s) + 1);
    StrPCopy(Result, s);
    end;
    exports
    ChangeMyString;
    begin
    end.
    Mon problème ici c'est que la dll ramène un seul resutat ! d'ou ma question comment la modifié pour quel ramène plusieurs.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 717
    Par défaut
    je viens de modifier ainsi mais ça an fonctionne pas
    voici le code :

    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
    24
    25
    26
    27
    28
    29
    30
    31
     
    library Madll;
     
    uses
      SysUtils,
      windows,
      Classes;
     
    {$R *.res}
     
    function ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util.dll';
     
    function ChangeMyString(const p,e: PChar): PChar; cdecl;
    var
    nomfichier: string;
    cheminfichier :string;
    begin
    nomfichier := extractfilename(string(p));
    cheminfichier:=ExtractFileDir(string(e));
     
    Result := ib_util_malloc(Length(nomfichier) + 1);
    StrPCopy(Result, nomfichier);
     
    Result := ib_util_malloc(Length(cheminfichier) + 1);
    StrPCopy(Result, cheminfichier);
     
    end;
    exports
    ChangeMyString;
    begin
    end.
    je comprend pas bien si Result est un mot réservé ou ... ?
    quelle est la variable qui encapsule la valeur qui retourné ?

    merci a tous

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Citation Envoyé par devalender Voir le message
    je comprend pas bien si Result est un mot réservé ou ... ?
    quelle est la variable qui encapsule la valeur qui retourné ?
    merci a tous
    Oui Result c'est la variable qui accueillera la valeur de retour de la fonction !
    correspond à

    Avant de t'attaquer au DLL et aux UDF FireBird, il te faudra mieux maîtriser le langage : Guide Pascal et Delphi - VI. Procédures et Fonctions - VI-C. Premières instructions en Pascal - VI-C-1. Affectations, la première ligne de cet article :
    Pour fixer le résultat d'une fonction, il va nous falloir donner une valeur à une variable (et cette variable sera 'result').
    Je te souhaite une bonne lecture des cours !


    Après pour tout ce qui est échange de pointeur, j'ignore exactement comme les UDF FB fonctionne, mais c'est quelque chose de complexe aussi !
    Semble que "ib_util_malloc" facilite cette partie, comme le SysAllocString pour les BSTR du COM
    Utiliser avec le FREE_IT, cela libère automatiquement la valeur de retour, c'est effectivement très pratique !

    Copier un extrait de la FAQ FireBird, c'est un début, maintenant, il te faut le comprendre !

    Car dans ton premier essai, tu avais deux ib_util_malloc mais une seule libération implicite par FREE_IT donc une fuite mémoire !

    Quelle version de Delphi ? 7 ? XE ?
    Pense si tu as une version unicode que le PChar est en réalité un PWideChar, deux octets par caractère !

    Dans ton second code, s n'est pas déclarée ??? je suppose que c'est nomfichier en réalité !

    Une fonction ne renvoi qu'un seul résultat, il faudrait avoir un paramètre de sortie de type PPChar ou out PChar mais est-ce possible en UDF comme ceci :

    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
    procedure ChangeMyString(const p,e: PChar, out r1, r2: PChar); cdecl;
    var
      nomfichier: string;
      cheminfichier :string;
    begin
      nomfichier := extractfilename(string(p));
      cheminfichier:=ExtractFileDir(string(e));
     
      r1 := ib_util_malloc(Length(nomfichier) + 1);
      StrPCopy(r1, nomfichier);
     
      r2:= ib_util_malloc(Length(cheminfichier) + 1);
      StrPCopy(r2, cheminfichier);
     
    end;
    il te faut maintenant trouver le script FireBird de recensement avec DECLARE EXTERNAL FUNCTION, il n'y pas mention de paramètre de Sortie et pas mention à une libération de ce type de paramètre !

    Tu vas devoir surement faire deux fonctions !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 717
    Par défaut
    Delphi 2005 !
    Merci vraiment, pour toutes ces réponses !
    Je compte pour ne pas forcer faire deux fonctions différentes .
    Merçi

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

Discussions similaires

  1. Problème de création d'udf
    Par devalender dans le forum SQL
    Réponses: 2
    Dernier message: 06/02/2012, 10h46
  2. Réponses: 7
    Dernier message: 16/06/2004, 15h02
  3. Problème de création de table sous MySql
    Par ducamba dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2003, 09h59
  4. Problème de création de fenêtre
    Par tomateauketchup dans le forum DirectX
    Réponses: 1
    Dernier message: 08/06/2003, 19h42
  5. [Rave Report] problème de création dynamique
    Par Nivux dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2003, 00h07

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