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 :

Pchar => DLL (String manip) => Pchar showmessage


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 70
    Points : 49
    Points
    49
    Par défaut Pchar => DLL (String manip) => Pchar showmessage
    Bonjour

    Je passe un Pchar en paramètre à une fonction d'une DLL qui doit modifier le contenu du string.
    Le contenu doit ensuite être affiché par la procedure appelante.

    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
     
    Procedure Appel();
     Mot : String;
     Pmot : Pchar;
    begin
      mot:='                        ';
     {alocate memory}
     GetMem(pword,Length(mot)) ; // takes a pointer
     pword :=  PChar(mot);
     
     ChangeMot(Pword)
     ShowMessage(string(PWord));
     
    {free the memory}
     FreeMem(pword) ;
     
    end;
    // Procedure dans la dLL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Procedure ChangeMot(var p : Pchar);
    var
        NouveauMot : String;
    begin
        NouveauMot := 'DRESSER';
        Move(NouveauMot,p,Length(NouveauMot));
    end;
    L'affichage de retour est 'DRES ' avec un symbole de fin de string je pense à la place de l'espace.

    Y a t-il mieux à faire ?
    merci

  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 : 55
    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
    aïlle ouille ! ça fait mal !

    je place les commentaires dans 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
     
    Procedure Appel();
     Mot : String;
     Pmot : Pchar;
    begin
    // A QUOI CA SERT ?
      mot:='                        ';
     {alocate memory}
    // pourquoi pas un getmem(pmot,24); ?
     GetMem(pword,Length(mot)) ; // takes a pointer
    // et voila que le getmem ci-dessus est perdu !
     pword :=  PChar(mot);
    // ici, pword pointe sur @mot[1], c'est tout..
     
     ChangeMot(Pword)
    // ...du coup, un ShowMessage(mot) suffirait (voir plus bas)
     ShowMessage(string(PWord));
     
    {free the memory}
     FreeMem(pword) ;
     
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Procedure dans la dLL
     
    // pas de VAR !!! c'est le contenu qu'on change pas la valeur du pointeur
    Procedure ChangeMot(var p : Pchar);
    var
        NouveauMot : String;
    begin
        NouveauMot := 'DRESSER';
    // non, un string EST un pointer, 
    // c'est donc ici la valeur du pointeur qui est copié
    // et "p" est aussi un pointer, il faut prendre l'adresse pointée "p^"
        Move(NouveauMot,p,Length(NouveauMot));
    end;
    ... donc voici ce qu'il est possible de faire:

    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
     
    procedure appel;
    var
     mot:string;
    begin
     SetLengh(mot,1024); // taille au pif 
     ChangeMot(@mot[1]);
     ShowMessage(mot);
    // NB: ShowMessage s'arrêtera sur le #0, pas la peine d'ajuster la taille
    end;
     
    procedure ChangeMot(p:pchar); 
    var
     NouveauMot:string;
    begin
     NouveauMot:='DRESSER'; // attention à ne pas dépasser les 1024 !
     move(NouveauMot[1],p^,Length(NouveauMot)+1);
    // on met un +1 pour inclure le #0 présent en fin de chaine
    end;
    mais on peut faire bien d'autres choses comme déjà débattu souvent ici et ailleurs....

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 70
    Points : 49
    Points
    49
    Par défaut
    oui ça fait mal...
    J'ai fait tellement de tests avec divers exemples qu'à la fin il y a des lignes inutiles et ça n'a plus aucun sens.

    En realité de delphi à delphi-DLL mon code originel marchait très bien. C'est en appelant avec REALBASIC que j'avais plus de difficultés.

    merci pour les corrections, j'ai corrigé dans realbasic et ça fonctionne à merveille.

    Bonne journée.

Discussions similaires

  1. DLL String Pourquoi ça marche sans BORLNDMM.DLL
    Par ShaiLeTroll dans le forum Langage
    Réponses: 14
    Dernier message: 09/09/2009, 10h41
  2. Problème de passage PChar à une DLL
    Par yupa dans le forum Débuter
    Réponses: 7
    Dernier message: 14/05/2009, 14h38
  3. Probleme encodage String (pchar) avec une dll
    Par yupa dans le forum Débuter
    Réponses: 8
    Dernier message: 11/05/2009, 18h00
  4. pchar et Tlist à la destruction des pchar
    Par bjl dans le forum Langage
    Réponses: 5
    Dernier message: 06/01/2006, 15h31
  5. DLL : récupérer des string/PChar...
    Par the_magik_mushroom dans le forum Langage
    Réponses: 8
    Dernier message: 10/11/2005, 10h58

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