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

C Discussion :

passer un handle d'une application à une autre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut passer un handle d'une application à une autre
    Bonjour

    J'ai 2 applications Windows qui communiquent par le biais d'une namedpipe. J'aurais besoin qu'une application accède a un handle (HWND) d'une windows de l'autre application. Je pensais passer cette information par la pipe: soit en passant l'adresse memoire du handle (je dois pouvoir ensuite récupérer mon handle à partir de cette adresse de l'autre côté), soit en castant mon handle en long puis en le recastant en handle de l'autre côté, si cela est possible. Laquelle des solutions vous semble la meilleure? Peut-être qu'il y également une autre meilleure solution à laquelle je n'ai pas pensée ?

    Merci d'avance

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 847
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Tout dépend de la validité d'un handle windows. Or, je n'en suis pas certain car je ne programme pas d'IHM type Windows mais j'ai la terrible impression qu'une handle windows n'a de sens que dans l'application dans laquelle cette windows a été créée (cette impression est issue d'une analogie que je fais entre "handle windows" et "handle fichier"). Dans ce cas, même si tu passes la handle, elle en te servira à rien de l'autre coté.

    Ceci dit je peux me tromper. Dans ce cas, la seule méthode possible est de passer la valeur numérique de cette handle (et non son adresse car une adresse, et ça c'est assuré, n'a elle de sens que dans le programme dans lequel elle est définie).
    Toutefois pourquoi veux-tu caster en long ??? T'as qu'à passer la handle directement en spécifiant bien le nombre d'octets qu'elle utilise. Les octets transiteront à travers le pipe et seront récupérés de l'autre coté dans une variable de même type qui deviendra alors automatiquement handle (toujours dans le cas où une handle a un sens dans un autre code bien entendu)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Bonjour,
    Ah, ça me rappelle des souvenirs! Mon premier programme avec une IPC (autre que les sockets) qui marchait était de ce type. Mon prof m'avait juste dis "si tu t'intéresses à ça, regarde du côté de CreatePipe() et DuplicateHandle()", et j'avais un truc qui marchait le soir même...


    Les handles d'objets USER (ce qui inclut les HWND) sont valide dans toute la session Windows; tu peux donc transmettre le HWND sans souci.
    Par contre, il faut caster en INT_PTR, pas en LONG.

    Les handles d'objets du kernel (ce qui inclut les tubes) peuvent être dupliqués d'un processus à l'autre avec DuplicateHandle(). Il faut un handle vers chaque processus. Le processus courant est obtenu avec GetCurrentProcess() ; l'autre, s'il n'est pas déjà connu de l'un des deux (ex: un processus a créé l'autre et possède donc déjà un handle dessus), le ProcessId peut être transmis et utilisé avec OpenProcess()

    Pour finir, les handles d'objets GDI (comme les HBITMAP) sont locaux au processus et ne peuvent pas être dupliqués.
    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.

  4. #4
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    nickel! Merci pour vos réponses

    J'ai pu aussi constater ce matin que les handles de windows (HWND) sont valides d'une application à une autre (en tout cas dans une même session).

    Dans mon cas, je dois juste transmettre des HWND donc pas besoin de dupliquer, mais merci pour l'explication supplémentaire, ça clarifie bien les choses.

    Par contre, pourquoi caster en INT_PTR et pas en LONG?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Parce que HWND est un typedef de pointeur, comme presque tous les handles. Il lui faut donc un type qui fait la taille d'un pointeur, et non la moitié.
    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
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Parce que HWND est un typedef de pointeur, comme presque tous les handles. Il lui faut donc un type qui fait la taille d'un pointeur, et non la moitié.
    oui, logique. En fait, comme le conseillait Sve@r, je peux meme passer mon handle tel quel au pipe en mode octets, et le caster directement en HWND à la sortie. Ca fonctionne bien.

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

Discussions similaires

  1. Passer d'une Application à une autre
    Par Sunrise2012 dans le forum Android
    Réponses: 3
    Dernier message: 12/06/2012, 16h07
  2. Réponses: 4
    Dernier message: 20/06/2007, 17h34
  3. conserver session d'une application à une autre!
    Par JauB dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 09/01/2007, 10h43
  4. Passer une variable d'une application à une autre
    Par dederfred dans le forum Delphi
    Réponses: 2
    Dernier message: 19/11/2006, 10h23
  5. Réponses: 1
    Dernier message: 23/05/2006, 14h36

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