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

Langage Delphi Discussion :

DLL et PChar


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 45
    Points : 34
    Points
    34
    Par défaut DLL et PChar
    Bonjour à tous!!

    Pour commencer, voici les présentations de mon environnement :
    - Delphi 5
    - Windows Xp
    - SQL server

    Je viens de développer une petite librairie me permettant de geocoder des lieux.
    Pour géocoder ces lieux, j'utilise l'API géocode de google et un composant XML prenant en charge le XPATH.

    J'ai donc dans ma DLL une fonction Geocode(adresse,cp,ville : PChar) : PChar, qui me permet à partir des paramètres en entrés, d'obtenir en sortie la latitude et la longitude sous la forme d'une seul et même chaine.

    Travaillant à partir d'une DLL, j'ai du mettre de coté le type String et travaillé à partir du type PChar. Cependant je rencontre le problème suivant:
    lors des 2 premiers appel de ma fonction géocode, la chaine de caractère retournée par celle-ci se termine par un $. Dès le 3 ème appel , la chaine de car caractère retournée est normale.

    Voici a quoi ressemble le result de ma fonction geocode :
    result := PChar(Lat+'|'+Lng);

    Pour corriger le problème je n'ai rien trouvé de mieux que de créer une variable temporaire temp de type pchar et de lui assigner inutilement la valeur suivante :
    temp := PChar(Lat+'|'+Lng);
    result := PChar(Lat+'|'+Lng);

    Quelqu'un a deja eu ce problème? Si oui, comment le corriger proprement?

    Merci pour vos réponse.

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    ton problème est assez classique

    tu fais bien de ne pas utiliser de string dans une DLL, mais cela implique de savoir ce que tu fais.

    en fait tu as 2 choix, le PChar résultat est soit alloué par la DLL, soit par l'EXE

    1) alloué par la DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // exemple à ne pas faire !
    function mafonction():PChar;
    var
      s : string;
    begin
      s := 'hello';
      Result := PChar(s + ' the world !');
    end;
    ce code passe à la compilation mais que se passe-t-il ?
    tu retournes l'adresse d'une chaîne, rien d'extraordinaire...mais où est la chaîne à la fin de la procédure ?! Nul part, elle n'existe plus !

    une solution simple (mais qui a ses limites) est de déclarer un string global
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var
      gStr : string;
    function mafonction():PChar;
    var
      s : string;
    begin
      s := 'hello';
      gStr:= s + ' the world !';
      Result := PChar(gStr);
    end;
    là le pointeur reste valide car gStr est en dehors de la fonction...mais attention ! sa valeur ne sera plus valide si on appelle la fonction une nouvelle fois !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     p1 := mafonction();
     p2 := mafonction(); // p1 n'est plus valide !!
    une autre solution est d'allouer la chaine et de déclarer une fonction de libération de cette chaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function getchaine:PChar;
    begin
      GetMem(Result, ...);
      Move(..., Result^, ...);
    end;
    function freechaine(chaine:PChar);
    begin
      FreeMem(chaine);
    end;
    2) allouée par l'EXE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function getdata(str: PChar; maxLen: Integer): Integer;
    begin
      Result := Length(s);
      if maxlen > Result then
       move(s[1], str^, Result + 1); // include le #0
    end;

    ici on demande à l'EXE de fournir un buffer et sa taille, on lui retourne la taille nécessaire et les données SI le buffer est suffisant.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    merci pour toutes ces infos, je vais maintenant tenter de corriger mon problème et je viendrais mettre un post.

    Merci encore

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Suite au conseil de Paul, j'ai modifié le retour de ma fonction en finissant par les 3 lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //Latitude et longitude séparée par une virgule
    temp:=Lat+','+Lng;
     
    //Allocation de la mémoire
    GetMem(result,length(temp)+1);
     
    result := PChar(Lat+','+Lng);

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par jonathansauret Voir le message
    Suite au conseil de Paul, j'ai modifié le retour de ma fonction en finissant par les 3 lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //Latitude et longitude séparée par une virgule
    temp:=Lat+','+Lng;
     
    //Allocation de la mémoire
    GetMem(result,length(temp)+1);
     
    result := PChar(Lat+','+Lng);
    ouille

    la dernière ligne remplace la valeur de Result, le pointeur alloué par le getmem est perdu (fuite de mémoire)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // en considérant que temp est un string (qui contient donc un 0 terminal)
    Move(temp[1], Result^, Length(temp) + 1)
    il est également possible d'utiliser un StrPCopy mais on évite la gestion des #0 avec Move
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Merci Paul, correction apportée à cette erreur.

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/04/2007, 11h45
  2. PChar en retour de DLL
    Par Tardiff Jean-François dans le forum Delphi
    Réponses: 7
    Dernier message: 29/01/2007, 09h19
  3. [Delphi] [DLL] Problème avec un paramètre PChar
    Par Mickey.jet dans le forum Langage
    Réponses: 1
    Dernier message: 22/03/2006, 16h43
  4. DLL : récupérer des string/PChar...
    Par the_magik_mushroom dans le forum Langage
    Réponses: 8
    Dernier message: 10/11/2005, 10h58
  5. Paramètre Pchar dans une DLL
    Par Writer dans le forum Langage
    Réponses: 4
    Dernier message: 25/08/2005, 01h33

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