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

MFC Discussion :

Existe-t-il une constante spécifique à chaque application ?


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Par défaut Existe-t-il une constante spécifique à chaque application ?
    Bonjour,

    Alors voici mon pb. J'utilise des envois de message dans mon application MFC.
    Pour ce faire, je définis un identifiant grâce à WM_APP ou WM_USER.
    Mais il y a une limitation, je voudrais pouvoir ouvrir 2 fois la même appli : .exe
    En l'essayant, J'ai pu utiliser les 2 appli en mêm tps ss pb mais lors de l'envoi de message au niveau des 2 appli en mêm tps, ça bug. Donc, les 2 appli utilisent le mêm ID pour envoyer des messages. Du coup, est-ce que qq'un connaitrai une constante définie par MFC qui soit spécifique à chaque appli ouverte.

    Merci bcp d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 461
    Par défaut
    Ne vous compliquez pas la vie.
    Envoyé le même message à la bonne application en utilisant le bon handle de fenêtre.
    l'envoi de message au niveau des 2 appli en mêm tps, ça bug
    Corrigez le, le l'évitez pas car il est vraisemblablement le symptôme de quelque chose de bien plus grave.
    Ne jamais éviter un bug sans parfaitement le connaître, sinon il vous rattrapera toujours, et souvent au plus mauvais moment.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Par défaut
    Merci d'avoir répondu aussi rapidement.

    Je pense que je n'ai pas assez bien expliqué la situation:
    -J'utilise un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define ID_PROG WM_APP+1
    J'envoie un message avec cet ID et il est intercepté par un handle qui utilise également le même ID_PROG.
    Tout marche parfaitement quand je lance le .exe et que je démarre mon programme. L'envoi de message marche très bien.
    Mais le pb, c'est que mon programme, j'ai besoin de le lancer plusieurs fois. Du coup, cela implique plusieurs ouverture du .exe.
    La encore, il ya pa de pb, j'ai 2 fois le mêm programme qui est ouvert sauf que quand j'arrive à la partie d'envoi de message, ça plante. En fait, les 2 programmes, utilisent ID_PROG (ou disons WM_APP+1) qui a la même valeur pour les 2 (moi je croyai que c'étai différent d'un programme à l'autre mais apparement cé juste dans le cas d'application différente). Du coup, au niveau de Windows, un même message est envoyé et il peut être intercepté par 2 handles (chacun correspondant au programme ouvert).
    Une solution serait de compiler la 1ère fois mon programme avec ID_PROG qui vaut WM_APP+1 et copier le .exe autre part puis de le recompiler avec ID_PROG qui vaut WM_APP+2; j'ai essayé ça marche très bien.
    Mais ce n'est qu'une solution provisoire, il faut plutot trouver une constante qui à chaque ouverture du même .exe a une valeur constante différente: une constante spécifique à chaque ouverture d'un programme

    Ca a l'air compliqué mais en réalité, ça l'est pa trop

  4. #4
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    A la place de cet ID, je suppose qu'il vaudrait mieux passer par des HWND.

    Bon courage.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 461
    Par défaut
    Peut-on voir le code qui post le message ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Par défaut
    Petite précision: les différents programmes (.exe) ouverts sont censés être indépendants.
    En fait, il s'agit d'un programme qui lance une fonction et envoie périodiquement des messages à une fenetre de progression qui reçoit le message et fait évoluer la barre de progression.
    Quand j'ouvre 2 programmes (.exe), les 2 sont censés travailler de façon indépendante et leur barre de progression évoluer ss pb (de façon indépendante). Sauf que là, il y a un lien entre les programmes ouverts, c'est que le même ID est utilisé du coup, c'est un peu n'importe quoi dans l'envoi et réception de messages. Pour un programme ouvert, ça passe, mais à partir de 2, rien ne va plus.. les messages se mélangent (à cause de l'ID)

    Merci pour l'info, concernant les HWND: ça marche comment, tu n'aurai pas un lien ou une information supplémentaire, ça permet également d'envoyer des messages et de les recevoir ?

    Merci pour votre aide !!

  7. #7
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Pour faire simple un HWND c'est un CWnd*.
    Contrairement au CWnd* le HWND n'est pas une classe, il ne dispora donc d'aucune méthode mais de fonction dont il sera le 1er argument (souvent les même que CWnd avec un argument de plus, le HWND).

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Par défaut
    On a une structure qui renferme le message à envoyer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct lesLabels
    {
    int id;
    int prog;
    string info;
    } lLabels;
    Voila pour le .cpp émetteur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pLabel->id=x;//identifiant pour la progression d'une barre.
    pLabel->prog=p; //Progression
    pLabel->info="2 paquets terminés / 5 restants";
    ::SendMessage(FindWindow(NULL,"Progression"),ID_PROG,(WPARAM)0,(LPARAM)pLabel);
    Le récepteur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BEGIN_MESSAGE_MAP(plog, CDialog)
    	ON_MESSAGE(ID_PROG, &plog::test)
    END_MESSAGE_MAP()
     
    LRESULT plog::test(WPARAM wParam,LPARAM lParam){
    lLabels* pLs=(lLabels*)lParam;
    progressVector[pLs->id]->SetPos(pLs->prog); //progressVector renferme des //CProgressCtrl*
    labelVector[pLs->id]->SetWindowTextA(pLs->info); //labelVector renferme //des CStatic*
    UpdateData(TRUE);
    }
    stdafx.h (inclu dans les 2 parties émettrices et réceptrices):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define ID_PROG WM_APP+1
    Je voulais pas mettre le code au départ car ça risquait de compliquer les choses, N'hesitez pas pour plus d'infos ! Merci !!

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 461
    Par défaut
    Poster des messages sans connaître la notion de HWND, ça sent le sapin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ::SendMessage(FindWindow(NULL,"Progression")
    WTF

    Vous devez avoir une référence sur la fenêtre de progression. Il est facile d'obtenir le HWND à partir d'un CWnd mais c'est souvent inutile.
    http://msdn.microsoft.com/en-us/libr...b3(VS.80).aspx

    "FindWindow(NULL,"Progression")" vous donnera un HWDN sur une fenêtre au hasard ayant comme titre "Progression". Vous aurez le même problème avec une seule instance du programme lancé si un autre programme (n'importe lequel, même qu'avec des fenêtres invisibles) a une fenêtre avec le même titre.

    Sous Windows, les applications, et encore plus les fenêtres des applications, c'est chacun chez soit et les poules seront bien gardées.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Par défaut
    Merci pour cette précision, je n'avais pas remis en cause cette partie du code mais votre commentaire est très pertinent.
    Quelle serait alors la solution ou bien juste une piste pour envoyer le message à la fenêtre "Progression" sans avoir de pb ?

    Merci !!

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 461
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s_ProgressWindow.SendMessage(ID_PROG,(WPARAM)0,(LPARAM)pLabel);
    s_ProgressWindow une référence sur la fenêtre de progression.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Par défaut
    En fait, j'avais codé tout ça, il y a longtemps. Ca marchait très bien. Je viens de tester récemment d'ouvrir 2 programmes en même temps. C'est là où ça a planté.
    Je connais bien sur la notion de HWND.
    Je viens de me rappeler le pb en fait, c'est que la fenêtre de progression et celle du lancement de la fonction sont dans 2 projets différents au sein de la même solution.
    Comment récupérer la référence vers le HWND "Progression" (celle-ci n'étant pas créer manuellement à partir du code mais plutôt avec insert dialog grâce à l'interface MFC) ?

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 461
    Par défaut
    c'est que la fenêtre de progression et celle du lancement de la fonction sont dans 2 projets différents au sein de la même solution.
    Quel rapport ?
    Le problème, c’est que vous postez des message à l'aveuglette avec des paramètres interprétés comme des pointeurs, qui n'ont de sens que dans le processus ayant posté le message.
    Si la fenêtre récupérant le message ne fait pas partie du même processus que le poster, c'est le plantage dans le meilleur des cas, mais cela peut être bien pire.

    En MFC, vous n'avez pas besoin du HWND (qui est stocké dans m_hwnd des CWnd) mais une référence sur un CWnd suffi.

    Lors de l'instanciation de la fenêtre de progression, vous récupérez bien un CWnd, non ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Par défaut
    Merci bcp bacelar pour ton aide !
    Maintenant à l'appel de la fonction, je lui donne en paramètre un pointeur vers la fenêtre "Progression".
    Merci en général pour ceux qui participent au forum qui font un très bon travail !!
    Pour ce qui est du problème initial : Existe-t-il une constante spécifique à chaque application ? (qui différencie une même application d'une autre qui est lancée 2 fois) Réponse : certainement !
    Mais dans mon cas, le problème était autre part !

    Merci encore bacelar !!

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

Discussions similaires

  1. AmChart : Définir une couleur spécifique à chaque partie
    Par Kazumi dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 30/04/2014, 10h46
  2. Réponses: 2
    Dernier message: 01/09/2010, 15h16
  3. Réponses: 14
    Dernier message: 11/03/2010, 11h46
  4. [A-03] Existe-t-il une constante "n'existe pas" ?
    Par Tipstitou dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/01/2009, 12h37
  5. [W2000] Réseau spécifique pour chaque application
    Par SkyDev dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 01/02/2007, 10h33

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