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 :

Réception d'une chaîne de caractères envoyée par un message Windows


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    Points : 67
    Points
    67
    Par défaut Réception d'une chaîne de caractères envoyée par un message Windows
    Bonjour,

    Je développe sous l'IDE delphi 2005. Dans mon programme j'ai une fonction qui réceptionne les messages. Je réceptionne un message contenant une chaine de caractère comme indiqué ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.RecepMessage(var msg : TMessage);
    var
      str : string;
    begin
     if Msg.Message = WM_UPDATEDATA then
      begin
         str := PChar(Msg.lparam);
         Edit1.text := UpdateDisplayMessage (str);     
      end
    end;
    Pour information. La fonction UpdateDisplayMessage me permet de modifier le message s'il est pas complétement conforme à ce que je veux afficher dans le champs de texte Edit1.

    Je voulais savoir si cette manière de réceptionner un message type chaine de caractère est complétement safe avec l'utilisation d'une variable string.

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 710
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 710
    Points : 13 174
    Points
    13 174
    Par défaut
    La façon de faire n'est pas exceptionnelle et ne fonctionnera à coup sûr que par SendMessage (synchrone) dans l'exe lui-même (envoi et réception).

    Il serait plus sage de créer un buffer dédié à ce message (libéré à la réception) par VirtualAlloc.

  3. #3
    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 445
    Points
    28 445
    Par défaut
    c'est plus ou moins "safe"

    1- cela ne fonctionnera qu'à l'intérieur d'un même process, impossible d'utiliser cette méthode vers une autre application
    2- la chaîne source doit exister au moment du traitement du message (pas de soucis avec un SendMessage, attention au PostMessage)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    Points : 67
    Points
    67
    Par défaut
    Bonjour,

    Je pourrais peut être directement réceptionner dans l’éditeur de texte comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       procedure TForm1.RecepMessage(var msg : TMessage);
       var
        str : string;
       begin
       if Msg.Message = WM_UPDATEDATA then
       begin
         Edit1.text := PChar(Msg.lparam);
         Edit1.text := UpdateDisplayMessage (Edit1.text);     
       end
    Est ce que vous pensez que ça change vraiment quelque chose?

    Merci

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 710
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 710
    Points : 13 174
    Points
    13 174
    Par défaut
    Ce n'est pas le remplissage du champ qui peut poser problème mais la validité de LParam.

  6. #6
    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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par nassim1987 Voir le message
    Bonjour,

    Je pourrais peut être directement réceptionner dans l’éditeur de texte comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       procedure TForm1.RecepMessage(var msg : TMessage);
       var
        str : string;
       begin
       if Msg.Message = WM_UPDATEDATA then
       begin
         Edit1.text := PChar(Msg.lparam);
         Edit1.text := UpdateDisplayMessage (Edit1.text);     
       end
    Est ce que vous pensez que ça change vraiment quelque chose?

    Merci
    comme dit Andnotor ça ne change pas le problème, et c'est même moins performant que de passe par Str:string

    ce que je voulais dire c'est quand dans cet exemple, c'est ok

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      s: string;
    begin
      s := 'Hello';
      SendMessage(Handle, WM_UPDATEDATA, Length(s), Integer(s)); // autant utiliser wParam pour donner la taille :)
      // arrivé, ici le message a déjà été traité
    end;
    mais dans celui-ci ça ne fonctionnera pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      s: string;
    begin
      s := 'Hello';
      PostMessage(Handle, WM_UPDATEDATA, Length(s), Integer(s)); // autant utiliser wParam pour donner la taille :)
      // arrivé ici, le message n'a pas encore été traité mais s va être supprimé et Integer(s) pointera sur une adresse mémoire invalide
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Envoi d'une chaine de caractères chiffrée par socket
    Par philou44300 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 29/08/2016, 10h42
  2. Réponses: 0
    Dernier message: 12/01/2016, 20h41
  3. Réponses: 7
    Dernier message: 05/04/2009, 10h40
  4. Réponses: 3
    Dernier message: 26/07/2006, 14h58
  5. Réponses: 4
    Dernier message: 26/12/2005, 17h01

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