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

Windows Discussion :

Conversion de type LPARAM


Sujet :

Windows

  1. #1
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 70
    Points : 45
    Points
    45
    Par défaut Conversion de type LPARAM
    bonjour,

    je lance depuis une application C# sur clic de bouton la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
            static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam);
    
    
    StringBuilder str = new StringBuilder("hello");
    
     SendMessage(p[0].MainWindowHandle, Convert.ToUInt32(0x0111), CAPTURE, str);

    je souhaiterai récupérer mon string str dans mon autre application C++ Win32 ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){}
    {
    Comment faire ??

    merci d'avance

  2. #2
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Tu peux passer un pointeur vers la chaine de caracteres dans le lParam :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SendMessage(IntPtr hWnd, uint Msg, WPARAM wParam, LPARAM lParam);
    SendMessage(p[0].MainWindowHandle, Convert.ToUInt32(0x0111), CAPTURE, (LPARAM) &str);
    Et ensuite, dans WndProc, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    StringBuilder *string;
    string = (StringBuilder *) lParam;
    Faut juste faire attention à la durée de vie de ta chaine de caracteres.

  3. #3
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Excuse moi mais je n'ai pas du bien comprendre

    les types WPARAM et LPARAM n'existe pas en C# !!!!

    donc je ne pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SendMessage(IntPtr hWnd, uint Msg, WPARAM wParam, LPARAM lParam);
    SendMessage(p[0].MainWindowHandle, Convert.ToUInt32(0x0111), CAPTURE, (LPARAM) &str);

  4. #4
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Arf !

    Je sais pas trop comment on melange du C++ et du C#...

    Mais tu peux toujours essayer en remplacant WPARAM et LPARAM par des types de même taille (c'est des pointeurs) genre void*

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Le type correspondant en C# est UIntPtr pour WPARAM et IntPtr pour LPARAM.

    Si tu veux que ton appli soit CLS-Compliante, tu peux utiliser IntPtr pour les deux.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Et, pour ma culture générale :

    C'est possible d'allouer un buffer en C#, de le remplir en C# et de passer son adresse à du code en C++ et d'utiliser son contenu en C++ ?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    M'étonnerait fort, sauf peut-être dans un bloc unsafe.

    Franchement, l'interface entre .Net et C++, ce n'est pas ce qu'on fait de mieux en C# : C'est le genre de chose qu'on fait dans une bibliothèque en C++/CLI, qui est fait pour ça...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    ok !!

    Mais si je mets IntPtr pour les deux, je ne pourrai pas utiliser Lparam
    pour envoyer un string non ?

    Mon but étant d'envoyer depuis mon application C# par le biais de SendMessage() un string contenant un path vers un fichier.

    Je souhaitais utiliser LPARAM que je n'utilisais pas jusqu'à présent.

    Il y a peut etre une autre manière de faire.

    ??

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Tu ne peux, pour plus d'une raison :
    • Une String est un truc spécial, que tu ne peux envoyer à une fonction non-managée. C'est peut-être possible d'envoyer un tableau de Char dans une section unsafe, ou avec les fonctions de System.InteropServices.Marshal, mais généralement on préfère passer la chaîne par l'intermédiaire d'une bibliothèque en C++/CLI.
    • C'est dans un autre process. Aucun marshalling n'est fait pour les messages persos, ce qui fait qu'un pointeur d'un process ne sera pas valide dans l'autre. Sauf pour un message WM_COPYDATA, qui doit respecter une syntaxe précise.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    mouai !! ok !

    Donc , puis-je utiliser à ce moment là WM_COPYDATA.

    Comment cela fonctionne-t-il ?

    Car il faut vraiment que je puisse envoyer cette chaine à mon application C++

    Merci

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    1. Regarde la doc du message.
    2. Utilise le tout dans une bibliothèque en C++/CLI, tu auras droit à des moyens efficaces de manipuler ta string (voir FAQ C++/CLI).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [DATE][CONVERSION] du type numerique au type date
    Par hamed dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/04/2005, 16h16
  2. Conversion de type
    Par sovitec dans le forum Langage
    Réponses: 5
    Dernier message: 15/12/2004, 14h29
  3. Conversion de type
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 06/07/2004, 10h30
  4. [MYSQL] conversion de type sur import de script
    Par sebos63 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 27/08/2003, 10h00
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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