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 :

partage mémoire


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut partage mémoire
    J'ai 2 prog : prog1.exe et prog2.exe.

    Dans prog1.exe une fenetre invisible pour et reception des message dans un thread+callback.

    dans prog2.exe j'envoie des message à la fenetre de prog1.
    Ca marche nickel sauf que je veux passer un parametre(une structure en fait)
    Comment faire pour accéder a ce paramètre depuis prog2.exe, sachant que l'espace mémoire pour la structure est alloué dans le processus prog1.exe
    Merci

  2. #2
    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
    Et bien il faut que tu fasses de la communication interprocessus
    Par exemple en utilisant les messages avec WM_COPYDATA
    Ou alors pipe nommés.
    Ou fichier mappé en memoire avec synchro par des events.
    Ou Socket .
    Fait une recherche sur Forum le sujet a déjà évoqué plusieurs fois.


  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    En fait je doit utiliser une fenetre et un postMessage.
    Je ne peux pas utiliser de pipe(WindowsCE).

    Cette solution me plais bien
    Par exemple en utilisant les messages avec WM_COPYDATA
    Pourrais-je avec des explications supplémentaires concernant le concept sous jacent stp. Techniquement je devrais ensuite m'en sortir facilement

    Ou fichier mappé en memoire avec synchro par des events.[
    Pour cette solution y a t il un exemple simple? Lien??

    Merci

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Il te faut une fenêtre.
    http://www.codeproject.com/threads/ipc_wmcopy.asp
    Une petite mise en garde quand même : veille à identifier ton process source, car certains programmes "porcs" envoient WM_COPYDATA à tout le monde plutot que de se fatiguer à identifier la fenêtre cible

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    super le lien!!

    Par contre comment faire pour envoyer une structure ???
    Faut-il calculer la taille de la structure et caster l'adresse de la struct. en void*??

    cpd.cbData = ...
    cpd.lpData = (void*)&struct;

    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
     
    CString strWindowTitle = _T("Window Name");
        CString strDataToSend  = _T("This is a message to send");
     
    	LRESULT copyDataResult;
    	CWnd *pOtherWnd = CWnd::FindWindow(NULL, strWindowTitle);
     
    	if (pOtherWnd)
    	{
    		COPYDATASTRUCT cpd;
    		cpd.dwData = 0;
    		cpd.cbData = strDataToSend.GetLength();
    		cpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData);
    		copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,
                                                    (WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),
                                                    (LPARAM)&cpd);
    		strDataToSend.ReleaseBuffer();
    		// copyDataResult has value returned by other app
     
    	} 
    	else 
    	{
    		AfxMessageBox("Unable to find other app.");
    	}	
    }

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    Toujours aucune réponse.....

  7. #7
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Il faut faire de la sérialisation. A toi de gérer la transformation de ta struct en un buffer qui peut être utilisé pour stocker ta struct (dans un fichier), l'envoyer par le réseau ou par... WM_COPYDATA.

  8. #8
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Bonjour,
    la meilleure solution a ta disposition sous EVC (j'u suis aussi) c'ets de passer par les zone de mémoirepartagées:

    CreateFileMapping
    MapViewOfFile

    Puis utiliser une mutex nommé obligatoirement pour synchroniser les accès concurrents à la zone partagée entre processus.

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    Merci bien Aurelien, c'est très gentil de répondre mais j'ai un mal enorme a te comprendre.

    Il faut faire de la sérialisation.
    Quel rapport avec le pb?????

    A toi de gérer la transformation de ta struct en un buffer qui peut être utilisé pour stocker ta struct (dans un fichier),
    De quel fichier parle-t-on???
    Là je pense que c est vraiment du hors sujet.

    l'envoyer par le réseau
    Là je pense que c est vraiment, mais vraiment du hors sujet.

    ou par... WM_COPYDATA
    On y vient mais il n'y a pas de détail....

    Voila ma question comme elle l'a été écrite dans le post
    Faut-il calculer la taille de la structure et caster l'adresse de la struct. en void*??
    Quand je le fais dans prog1.exe, et que je lis ce qu'il y a en memoire dans prog2.exe, il y a mes données mais elles sont décallées donc pas à l'addresse prévue.
    En essayant de trasmettre une chaine ca me fais la meme chose.
    Comment donc transmettre une chaine de prog1.exe à prog2.exe EN PASSANT par WM_COPYDATA de la maniere la plus simple possible.
    Il y a quelque chose qui me dépasse mais je pense que ca doit etre un probleme connu, vu la simplicité du traitement.
    Merci de votre rigueur.

  10. #10
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Serialiser c'est transformer ta structure en mémoire en un flux de données. Je te donnais des exemples d'application : que tu stockes sur disque, que tu envoies par le reseau ou pas WM_COPYDATA, c'est strictement le même problème : sérialiser ta structure.
    Une fois que tu as tes données sérialisées sous forme de buffer / string, alors tu envoies ça via WM_COPYDATA, en initialisant cpd.lpData pour qu'il pointe vers ton buffer. cpd.cbData contient la taille de ton buffer.

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    Cela reviens donc a caster ta structure en void* non????
    Si tu lis la suite de mon post, tu t apercois que la chaine que je transmet est "altérée".

    Tu n'a pas un exemple super simple qui marche par hasard???
    Merci

  12. #12
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    Toujours rien???
    Je maitrise pas la situation.

  13. #13
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par benoit70
    Cela reviens donc a caster ta structure en void* non????
    Ca dépend de ta struct. Si elle contient des pointeurs, non. Sinon, ça peut suffire.
    D'autres liens:
    http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/dataexchange/datacopy/usingdatacopy.asp
    http://www.codeguru.com/Cpp/W-P/win32/article.php/c1429/
    http://www.flounder.com/wm_copydata.htm

  14. #14
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    http://www.codeguru.com/Cpp/W-P/win32/article.php/c1429/

    Ce lien ne fait que le la comm. inter-process et non pas inter-processus. Ce sont 2 concepts complètement différents.
    Il faut considérer un processus comme un executable à part entière.

    Tu n'as pas un exemple avec 2 executables un qui envoie une chaine et l'autre qui la recoit.
    Un truc tout fait pour que je puisse voir ce qui diffère de mon code
    Merci

  15. #15
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par benoit70
    Ce lien ne fait que le la comm. inter-process et non pas inter-processus. Ce sont 2 concepts complètement différents.
    ah bon ? Process c'est en anglais, processus en français. C'est la seule différence que j'y vois.
    Le fait que cet exemple d'auto-lance ne change rien. C'est comme si y'avait 2 process séparés.
    Concernant ta question sur CreateProcess, tout se passe dans CIpcDemoApp::InitInstance() qui détermine le type de l'instance via GetAppType() (au moyen de mutex).
    La première instance devient le serveur et crée le dialogue CIpcSendDlg, c'est lui qui fait le CreateProcess. Ce CreateProcess lance la 2° instance. Comme le mutex existe déjà, il en déduit qu'il est le client, et crée CIpcRecvDlg au lieu de CIpcSendDlg.
    Tu peux considérer CIpcSendDlg comme la fenêtre de l'exe A, et CIpcRecvDlg comme étant créée par un autre exe B.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2014, 15h00
  2. Partage mémoire pour tous les processus
    Par luckyvae dans le forum POSIX
    Réponses: 4
    Dernier message: 05/03/2008, 04h41
  3. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  4. [CR][paradox] mémoire partagée disponible insuffisante !
    Par AGT dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 24/03/2004, 14h27
  5. Partage de blocs mémoire entre 2 processus
    Par rolkA dans le forum Windows
    Réponses: 6
    Dernier message: 18/11/2003, 19h08

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