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 :

Vrai multidoc automatique


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut Vrai multidoc automatique
    Bonjour je développe un logiciel utilisant MFC sous Visual 2005 que j'aimerais pouvoir utiliser aussi en ligne de commande.
    Voici le souci si je fais les les commandes suivantes :

    - C:\logiciel /o fichier1
    puis :
    - C:\logiciel /o fichier2

    j'aimerais qu'il m'ouvre les deux fichiers dans un seul et même exécutable en multidoc comme quand je le fais à partir du menu->Fichier->ouvrir de mon application.
    Or là, ça m'ouvre deux exécutables avec chacun son fichier.

    En gros j'aimerais qu'il y est qu'une seule instance de mon exécutable.

    Merci d'avance pour toutes aides sur ce sujet.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Je ne suis pas spécialiste de MFC, mais je sais qu'il y a des tutos entiers consacrés au mdi, y compris sur developpez.com je crois.

  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
    Par défaut
    salut,
    je ne pense pas que ce soit possible directement puisque c'est le chemin d'argument qui est analysé.
    ce que tu peux faire:
    c'est détecter le déclenchement d'une deuxième instance de ton programme avec une ligne d'argument.
    http://c.developpez.com/faq/vc/?page...NoMoreInstance
    rechercher la fenêtre principale de la première instance.
    http://c.developpez.com/faq/vc/?page...dWindowDesktop
    lui envoyer un message pour faire le travail.
    et abandoner la nouvelle instance (return 0 dans InitInstance).

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut
    oky.. tout ça à l'air très interessant je regarde ça de plus près...

    Merci

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut
    Impeccable, ça à l'air de bien marcher...
    maintenant il faut que je m'attaque aux messages windows.
    pour ouvrir le fichier2 (de l'exemple) dans la première instance de mon application...

    Il n'y a pas de message prédéfini pour ça ou il faut le coder ???

    Merci encore

  6. #6
    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
    tu peux utiliser un WM_COPYDATA pour communiquer avec l'autre instance:
    http://msdn.microsoft.com/library/en...e/datacopy.asp

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut
    Bon impecc ça avance bien... coté envoi du message je trouvais la méthode bourrine.. de faire le while(1) sur toutes les fenetres alors qu'apparemment il y avait une fonction FindWindow dans MFC, mais bon une fois qu'un document est ouvert dans mon appli... le FindWindow ne marche plus alors que la méthode proposée plus haut marche dans tous les cas, donc je l'ai gardé :-D

    Par contre maintenant je bloque pour savoir comme intercepter le SendMessage...

    J'ai rajouté.. un :
    ON_MESSAGE(WM_COPYDATA, OnCopyData)
    dans le MESSAGE_MAP de ma MainFrm mais ca marche pas...

    Je continue mes recherches.. si quelqu'un à la solution... merci

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut
    Bon je montre comment je fais :
    Tout d'abord mon appli et une appli MFC MDI de base avec le Appli.cpp MainFrm.cpp AppliDoc.cpp ...

    Dans le fichier Appli.cpp j'ai placé :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    // déclaration d'une section AppliApp
    #pragma data_seg("AppliApp") 
    // la variable commune a tous les process
    long nCtApp = -1; 
    #pragma data_seg()
    // directive pour le link.
    #pragma comment(linker, "/section:AppliApp,rws") 
     
    BOOL CAppliApp::InitInstance()
    {
        // Test incrémentation de la variable. 
        bool bFirstInstance = (InterlockedIncrement(&nCtApp) == 0);
        if(!bFirstInstance) // erreur le prog est déjà lancé.
        {
            // On recherche la CWnd du programme déjà lancer pour lui transmettre le message
            char szIdentite[]="Appli";
            CWnd* pWnd = CWnd::GetDesktopWindow( )->GetTopWindow( );
            CWnd *pWndAppli = 0;
            CString s,strWord;
            while( 1 )
            {
                pWnd = pWnd->GetNextWindow();
                if ( pWnd == NULL ) break;
                pWnd->GetWindowText( s );
                strWord=s;
                if(strWord.Find(szIdentite)!=-1)
                {
                    pWndAppli = pWnd;
                    break;
                }
            }
            if(pWndAppli != 0)
            {
                COPYDATASTRUCT cpdtData;
                cpdtData.cbData = StrLength(GetCommandLine());
                cpdtData.lpData = GetCommandLine();
                cpdtData.dwData = 0;
                ::SendMessage(pWndAppli->m_hWnd,WM_COPYDATA,(WPARAM)0,(LPARAM)&cpdtData);
            }
            return FALSE; // L'appli s'arrete
        }
         ..... // ici l'appli continue....
    }
    Maintenant j'ai placé :
    ON_MESSAGE(WM_COPYDATA, OnCopyData)
    dans le MESSAGE_MAP de MainFrm.cpp
    mais sans succes...
    puis dans Appli.cpp la il y a une erreur... c'est bon signe peut être car il existe déjà une fonction OnCopyData... mais j'arrive pas à la surcharger...
    pense a mettre la balise de code,Merci Farscape

  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,
    pour la longueur je mettrai :StrLength(GetCommandLine())+1
    pour avoir le \0 compris .
    pour la reception de WM_COPYDATA il faut mettre la fonction avec l'assistant,
    c'est prévu.
    l'autre piége c'st qu'il faut fermer visual sinon le findwindow va trouver visual pour le WM_COPYDATA a cause du nom du projet ....

  10. #10
    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
    note:
    tu devrais pouvoir rappeller la fonction ParseCommandLine de la classe d'application en construisant un objet CCommandLineInfo d'apres ton copydata...

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut
    Ok je regarde ça pour la taille du GetCommandLine() merci..
    .
    Sinon j'ai jamais utilisé l'assistant... j'ai trop programmé avec emacs pour utiliser ce genre de fonctionnalité avec VC++ comme ça marche-t-y ???

    Merci

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut
    pour le ParseCommandLine.. je m'en doutais un peu qu'on pouvait s'en resservir... mais bon j'avais une autre idée en tête... merci quand meme de la précision.

  13. #13
    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 skalimer0
    Ok je regarde ça pour la taille du GetCommandLine() merci..
    .
    Sinon j'ai jamais utilisé l'assistant... j'ai trop programmé avec emacs pour utiliser ce genre de fonctionnalité avec VC++ comme ça marche-t-y ???

    Merci
    l'assistant pour rajouter un message ?
    tu places le curseur au milieu du bloc BEGIN_MESSAGE_MAP de la classe Mainframe dans ton source.
    tu fais alt+entrée, la fenêtre propriété s'ouvre tu clics sur le bouton a droite de l'éclair (messages).
    tu as la liste des messages
    tu choisis WM_COPYDATA et le message de réponse est généré....

  14. #14
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut
    ouuuaaaahhh la classe...

    ça compile...

    je teste...

    cooooool ca marche...
    j'ai plus qu'a rediriger les fonctions aux bons endroits...

    Merci pour tout fairscape

  15. #15
    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 skalimer0
    pour le ParseCommandLine.. je m'en doutais un peu qu'on pouvait s'en resservir... mais bon j'avais une autre idée en tête... merci quand meme de la précision.
    tu as lu ça ,a mon avis en 3 lignes de code c'est bon ...

  16. #16
    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
    essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
    {
        // TODO: Add your message handler code here and/or call default            
     
        CCommandLineInfo cmdInfo;
        cmdInfo.ParseParam(reinterpret_cast<char *>(pCopyDataStruct->lpData),FALSE,TRUE);
        AfxGetApp()->ParseCommandLine(cmdInfo);
     
        return CFrameWnd::OnCopyData(pWnd, pCopyDataStruct);
    }
    a tester je n'ai pas essayé...

  17. #17
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut
    Nop ca marche pas sur mon appli de faire ça... mais je me suis débrouillé différemment et ça marche. En effet je reparse moi meme le Getcommandline envoyé.

    Et puis ça tombe bien car je voulais rajouter des fonctions...

  18. #18
    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
    arf je me suis trompé c'est ça que je voulais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     CCommandLineInfo cmdInfo;
     cmdInfo.ParseParam(reinterpret_cast<char*>(pCopyDataStruct->lpData),FALSE,TRUE);
     AfxGetApp()->ProcessShellCommand(cmdInfo);
    tu peux juste essayer et me dire si ça fonctionne ?

  19. #19
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut
    nop toujours pas...

  20. #20
    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
    si le sujet est réglé pense a cliquer sur

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

Discussions similaires

  1. [VB6] [Interface] Redimensionnement automatique
    Par ychalan dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2002, 18h32
  2. BDE : Configurer automatiquement le NETDIR
    Par Harry dans le forum Paradox
    Réponses: 10
    Dernier message: 29/07/2002, 11h33
  3. Génerer automatiquement plusieurs fichier .doc
    Par brunovitch dans le forum QuickReport
    Réponses: 3
    Dernier message: 09/07/2002, 08h19
  4. Re-dimensionnement automatique de composants
    Par ludo_7 dans le forum C++Builder
    Réponses: 10
    Dernier message: 16/05/2002, 16h35

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