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 :

communication entre 2 applications (exe)


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    rpsi
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : rpsi

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut communication entre 2 applications (exe)
    Bonjour,
    Quelle méthode dois je utiliser pour communiquer entre 2 .exe ?
    Mon contexte:
    -2 applications MFC A & B
    -j'aimerais que l'application A envoi un message à l'application B pour lui demander de s'arrêter (proprement...)
    -l'application B doit donc scruter ce genre de message afin de déclencher sa fermeture...
    -j'utilise actuellement le code ci-dessous dans l'application A afin de déclencher un traitement quand l'application B se termine, mais j'aimerais "précipiter" cette terminaison
    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
    23
    24
    25
    26
    27
    28
    29
    30
     
    // code de l'application 'A'
    bool CUpdaterApp::Wait()
    {
        HANDLE hSnapShot;
        PROCESSENTRY32 uProcess;
        BOOL r;
        short PID = 0;
        hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
        uProcess.dwSize = (DWORD) sizeof(PROCESSENTRY32);
        r = Process32First(hSnapShot, &uProcess);
        do 
        {
            if ( strstr(uProcess.szExeFile, "B.exe") ) // on compare au nom de l'executable
                PID = (short) uProcess.th32ProcessID;
            r = Process32Next(hSnapShot, &uProcess);
        }
        while ( r );
        CloseHandle(hSnapShot);
        if ( PID == 0)  return false;
        HANDLE hTemp;
        hTemp = OpenProcess(PROCESS_ALL_ACCESS, false, (DWORD) PID);
        WaitForSingleObject( hTemp, INFINITE );
     
        DWORD retour;
        GetExitCodeProcess(hTemp,&retour);
     
        CloseHandle( hTemp );
        return(true);
    }
    j'espère avoir été clair...

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    Ce sont des applications console (difficile) ou fenêtrées (facile) ?
    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.

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055

  4. #4
    Membre averti
    Homme Profil pro
    rpsi
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : rpsi

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut
    Citation Envoyé par Médinoc
    Ce sont des applications console (difficile) ou fenêtrées (facile) ?
    c'est une application fenêtrées et l'application B a été "lancée" par l'application A via createprocess.

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    alors tu as ta reponse dans la faq...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    Euh... J'ai des doutes sur cette entrée de la FAQ...
    WM_CLOSE sert à ordonner de fermer une fenêtre (SYSCOMMAND(SC_CLOSE) entraîne WM_CLOSE qui entraîne DestroyWindow()), si j'ai bien compris l'aide. Il faudrait donc plutôt envoyer ce message vers une fenêtre (trouvée avec FindWindow() par exemple), non?


    WM_QUIT, par contre, termine un thread UI en forçant la sortie de sa MessageLoop...
    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.

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par Médinoc
    Euh... J'ai des doutes sur cette entrée de la FAQ...
    WM_CLOSE sert à ordonner de fermer une fenêtre (SYSCOMMAND(SC_CLOSE) entraîne WM_CLOSE qui entraîne DestroyWindow()), si j'ai bien compris l'aide. Il faudrait donc plutôt envoyer ce message vers une fenêtre (trouvée avec FindWindow() par exemple), non?


    WM_QUIT, par contre, termine un thread UI en forçant la sortie de sa MessageLoop...
    voir note MSDN:
    http://support.microsoft.com/default...EN-US;Q178893&

  8. #8
    Membre averti
    Homme Profil pro
    rpsi
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : rpsi

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut
    rebonjour,
    alors suite à vos diverses réponse, j'ai essayé plusieurs petites choses, mais en gros, j'ai toujours mon problème...

    a) 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
     
        HWND hWnd=FindWindow(NULL,"A.exe");
        if(!hWnd)
        {
            AfxMessageBox("echec findwindow",MB_ICONEXCLAMATION|MB_OK|MB_DEFBUTTON1);
            return;
        }
        AfxMessageBox("findwindow ok",MB_ICONEXCLAMATION|MB_OK|MB_DEFBUTTON1);
     
        DWORD dwProcessId;
        DWORD hThread = GetWindowThreadProcessId(hWnd,&dwProcessId);
        BOOL bRet;
        bRet=::PostThreadMessage(hThread,(UINT) WM_QUIT,0,0);
        if(!bRet)
        {
            AfxMessageBox("echec PostThreadMessage",MB_ICONEXCLAMATION|MB_OK|MB_DEFBUTTON1);
        }
    part toujours en "echec findwindow"... alors que l'application 'A' est bien active


    b) j'ai essayé 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
    23
    24
    25
    26
     
        char szIdentite[]="A.exe";
        CWnd* pWnd = CWnd::GetDesktopWindow( )->GetTopWindow( );
        CWnd *pWndApp = 0;
        CString s,strApp;
        while( 1 )
        {
            pWnd = pWnd->GetNextWindow();
            if ( pWnd == NULL ) break;
            pWnd->GetWindowText( s );
            strApp=s;
            if(strApp.Find(szIdentite)!=-1)
            {
                pWndApp = pWnd;
                break;
            }
        }
        if(pWndApp)
        {
            AfxMessageBox("Application trouvée",MB_ICONEXCLAMATION|MB_OK|MB_DEFBUTTON1);
            ::PostMessage(pWndApp->GetSafeHwnd(),WM_SYSCOMMAND, SC_CLOSE, 0L );
        }
        else
        {
            AfxMessageBox("Application non trouvée",MB_ICONEXCLAMATION|MB_OK|MB_DEFBUTTON1);
        }
    part toujours en "application non trouvée"


    c) j'ai une question complémentaire:

    comment intercepter WM_QUIT sur l'application 'A' (quand j'aurais réussi à envoyer le message...)
    en effet, je ne vois pas WM_QUIT dans le classwizard sur la classe d'application (alors que je vois WM_CLOSE)

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    il me semble que tu n'as pas besoin de chercher la fenêtre puisque c'est toi qui lance le process b, tu disposes donc de tous les éléments pour faire le PostThreadMessage comme indiqué dans le post de la faq (cité plus haut), et en mettant WM_QUIT.

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    WM_QUIT n'est pas interceptable: Il termine la boucle de messages et le thread destinataire reprend son exécution après la boucle.
    (C'est-à-dire, dans le cas d'un programme MFC Dialog-Based, après le DoModal()).


    Le second paramètre de FindWindow() ne doit pas être le nom de l'exécutable, mais le titre de la fenêtre.
    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.

  11. #11
    Membre averti
    Homme Profil pro
    rpsi
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : rpsi

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut
    Citation Envoyé par Médinoc
    WM_QUIT n'est pas interceptable: Il termine la boucle de messages et le thread destinataire reprend son exécution après la boucle.
    (C'est-à-dire, dans le cas d'un programme MFC Dialog-Based, après le DoModal()).


    Le second paramètre de FindWindow() ne doit pas être le nom de l'exécutable, mais le titre de la fenêtre.
    -merci, c'est ok pour findwindow()...
    -pour wm_quit, mon application 'A' est en MFC MDI...

  12. #12
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 256
    Par défaut
    Salut,

    tu pourrais essayer le truc suivant:
    - process A crée un sémaphore.
    - process A lance process B en lui indiquant le sémaphore ( si je me souviens
    bien, tu lui passe ds un des args de CreateProcessus() sous forme d'une
    adresse - un truc comma ça - ( process A détient le sémaphore à ce
    moment là ).
    - Quand process A n'a plus besoin de process B, alors il relâche le sémaphore
    => Process B le récupère et "comprends" qu'il doit s'auto-terminer.

    Sinon, si tu veux garder les messages, essaie de voir la MSDN mais du coté
    "SetEvent()", "PulseEvent()","ResetEvent()" qui sont plus des fonctions "multi-tâches" que les traditionnelles "GetMessage()","SendMessage()","PostMessage()" etc.

    A+.

  13. #13
    Membre averti
    Homme Profil pro
    rpsi
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : rpsi

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut
    merci, je vais voir çà

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

Discussions similaires

  1. Communication entre 2 application sur un poste
    Par ggounouman dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 03/09/2007, 15h17
  2. Communication entre 2 applications (C++/C#)
    Par SLy17 dans le forum C++/CLI
    Réponses: 1
    Dernier message: 07/08/2007, 10h37
  3. Réponses: 2
    Dernier message: 28/03/2007, 11h32
  4. communication entre deux applications
    Par ilhamita dans le forum Langage
    Réponses: 1
    Dernier message: 06/03/2007, 15h28
  5. Communication entre plusieurs applications.
    Par granquet dans le forum Linux
    Réponses: 9
    Dernier message: 01/06/2006, 14h42

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