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 :

Question sur #pragma data_seg...


Sujet :

MFC

  1. #1
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut Question sur #pragma data_seg...
    Bonjour,

    Voil�, je cherche � communiquer entre 2 applis (les 2 m�mes en fait).
    J'ai bien compris l'astuce de partager des variables dans des sections. Par exemple:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    #pragma data_seg("DvdAtApp") 
    	HWND DvdAtHandle = 0; 
    #pragma data_seg() 
     
    #pragma comment(linker, "/SECTION:.DvdAtApp,RWS")

    A partir de ce code je partage ma variable...ok. Mais comment fait-on pour acc�der � cette m�me variable � partir d'une autre appli ?

  2. #2
    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
    On peut pas. Seules les diff�rentes instances du m�me exe physique le peuvent.

  3. #3
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut
    Oui je comprends bien. Je sui bien dans le cas o� j'ai 2 diff�rentes instances du m�me exe.

  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
    Et bien y'a rien de sp�cial � faire. Tu l'utilise directement comme une variable normale. Juste faire attention au fait que une instance peut la modifier pendant que l'autre la lit...

  5. #5
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut
    Le probl�me est que je ne voie pas comment acc�der � la variable de cet exe. Je ne dois pas avoir bien compris au fonctionnement des sections ou alors il me manque des infos.

    Est-ce
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    #pragma comment(linker, "/SECTION:DvdAtApp,RWS");
    qui me permet d'acc�der � cette variable en question ?

    Comment puis-je acc�der � la valeur de la variable apr�s cela?

  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

  7. #7
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut
    Salut farscape !

    En fait je l'avais d�j� vu cet exemple mais je ne comprend pas tout.
    Je comprends bien la signification de la d�finition de la section qui va en fait permettre le partage de ma ou mes variables.

    Ensuite il y a l'acc�s � cette variable. Est-ce le code #pragma comment(linker, "/section:TestApp,rws") qui le permet ?

    Franchement ce n'est pas clair. J'ai beau regarder un peu partout...
    Bon...suivons l'exemple pas � pas.
    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
     
    // déclaration d’une section TestApp
     
    #pragma data_seg("TestApp") 
     
    // la variable commune a tous les process
    LONG nCtApp = -1; 
    #pragma data_seg()
     
    // directive pour le link.
     
    #pragma comment(linker, "/section:TestApp,rws") 
     
    // Test incrémentation de la variable. 
     
    bool bFirstInstance =  (InterlockedIncrement(&nCtApp) == 0);
    if(!bFirstInstance)
    {
           // erreur le prog est déjà lancé.
    }
    Effectivement ton exemple marche mais j'ai du mal � faire le rapprochement avec mon probl�me. Mon cas est que si le handle de la fen�tre (la dlg principale de mon prog) avec qui je veux communiquer est renseign� dans la variable partag�e alors je lui balance des infos.

    Le probl�me est que ce handle doit �tre renseign� une fois que ma fen�tre est cr��e et que le test dois se faire au d�marrage de mon instance de programme...donc bien en amont. Je suis d�sol� de para�tre lourd mais je suis largu�.

  8. #8
    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
    Dans ta section commune, ajoute une variable HWND. Si c'est la premi�re instance, tu cr�e la fen�tre et initialise le HWND commun. Sinon, tu utilises directement le HWND qui d�signe la fen�tre de l'autre instance...

  9. #9
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut
    Ok...je vois. Bon �a fonctionne dans l'ensemble. J'ai plus qu'� faire communiquer les 2 fen�tres maintenant que j'ai le HANDLE.

    C'est avec SendMessage Non ? Et sur la fen�tre en question je place l'�v�nement WM_COPYDATA?

    En tous cas merci � tous les 3.

  10. #10
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut
    Heu...je vais encore vous emb�ter une derni�re fois mais j'ai un tout petit probl�me � r�soudre.

    Voil�...il m'est impossible de conna�tre le HANDLE de ma dlg principale tant qu'elle n'est pas cr�e...�videmment.

    Lorsque j'ouvre mon programme, le fichier principal qui g�re la cr�ation de l'instance s'occupe de renseigner ma variable partag�e et de la renseigner avec le HANDLE de ma dlg...une fois cr�e.

    Le probl�me est que une fois que j'ai appel� la ligne de code dlg.DoModal() et ben je peux plus renseigner ma variable partag�e...puisque tout se passe maintenant dans mon code de cette dlg principale. Et inversement, je ne peux pas renseigner ma variable partag�e tant que ma dlg principale n'est pas cr��e.

    Alors...voil� ma question. Est-il possible de renseigner ma variable partag�e (qui est au niveau de mon programme principal), en aval dans mon programme de la dlg principale ?


    Petites explications suppl�mentaires

    Mon Appli s'apelle toto.exe
    Mon programme principal toto.cpp instancie l'appli toto.exe, partage ma variable et cr� ma dlg principale
    Ma dlg principale s'appelle totodlg.cpp et doit renseigner ma variable partag�e (situ�e dans toto.cpp) sur son Handle.

    Vous voyiez le truc???[/list]

  11. #11
    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
    Ben rajoute une ligne dans le OnInitDialog de ta dialog pour initialiser le handle.
    Mais je pense � un truc, c'est qu'entre le moment o� ton exe modifie nCtApp et initialise le HWND, il s'�coule un petit bout de temps. Dans le pire des cas, une autre instance peut � ce moment utiliser le handle, qui sera invalide. Mais faut vraiment que les 2 instances soient d�marr�es en m�me temps. Donc tu peux ignorer le probl�me, car s'il se produit, ben un SendMessage sur un handle nul sera sans effet.

  12. #12
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut
    Ben je veux viens initialiser le handle � partir de OnInitDialog mais le probl�me c'est que je n'ai pas acc�s � partir de totodlg.cpp � ma variable partag�e du programme toto.cpp.

    Concernant ta remarque pertinente sur le labs de temps entre les 2...pas de probl�me.

  13. #13
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut
    Ou alors l'id�e est de re�crire

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    #pragma data_seg("DvdAtApp") 
    	HWND DvdAtHandle = NULL;
    #pragma data_seg()
     
    #pragma comment(linker, "/section:DvdAtApp,rws");
    au niveau de totodlg.cpp.

    En somme cette portion de code sera � 2 endroits diff�rents.

  14. #14
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut
    Ma derni�re id�e est bidon...j'ai une erreur du compilateur qui me dit que ma variable est d�j� d�finie. Donc je peux y acc�der � partir de totodlg.cpp, mais comment?

  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
    En somme cette portion de code sera � 2 endroits diff�rents.
    c'est pas tr�s bon de dupliquer les choses, la preuve.
    Cr�e un .h que tu utilises pour acc�der � ta variable commune et un .cpp o� tu la mat.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    // .h
    #pragma once
     
    HWND GetMyAppHandle();
    void SetMyAppHandle(HWND);
    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
     
    // .cpp
    #pragma data_seg("DvdAtApp") 
    namespace // anonyme
    {
        HWND DvdAtHandle = NULL; 
    }
    #pragma data_seg() 
     
    HWND GetMyAppHandle()
    {
        return DvdAtHandle;
    }
    void SetMyAppHandle(HWND hWnd)
    {
        DvdAtHandle = hWnd;
    }

  16. #16
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut
    C'est une tr�s bonne id�e �a !

  17. #17
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut
    Salut � vous...pour un bon d�but de semaine.

    J'ai essay� la m�thode d'aur�lien avec succ�s mais je gal�re un peu sur l'envoie du message � ma fen�tre en question.

    Concernant l'envoie, j'utilise la fonction SendMessage

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    LPCTSTR r = "bonjour";
    SendMessage(MonHandle, WM_COPYDATA , 0, (LPARAM)&r);
    Ensuite pour r�cup�rer ma donn�e je g�re l'�v�nement au niveau de ma dlg Toto (classe CTotoDlg) qui a le handle sp�cifi�.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    BOOL CTotoDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
    {
    	return CDialog::OnCopyData(pWnd, pCopyDataStruct);
    }
    Le probl�me c'est que �a ne marche pas.
    Je ne sais pas si j'utilise le bon �v�nement dans la fonction SendMessage ni si je l'appele correctement.
    Par contre je suis certains de la bonne valeur du Handle de ma dlg.

    Une id�e ?

  18. #18
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    a l'envoi, utilise la structure COPYDATASTRUCT

    un truc du genre :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    COPYDATASTRUCT cds;
    cds.dwData = 0;
    cds.cbData = (strlen(message)+1) * sizeof(TCHAR);
    cds.lpData = _alloca(cds.cbData);
    strcpy(cds.lpData, message);

  19. #19
    liv
    liv est d�connect�
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par d�faut
    Tu veux dire de faire cela ?

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    LPCTSTR message = "bonjour";
     
    COPYDATASTRUCT cds; 
    cds.dwData = 0; 
    cds.cbData = (strlen(message)+1) * sizeof(TCHAR); 
    cds.lpData = _alloca(cds.cbData); 
    strcpy((char*)cds.lpData, message);
     
    ::SendMessage(WinDvdAt, WM_COPYDATA , 0, (LPARAM)&cds.lpData);
    Le probl�me est que de toute fa�on je n'arrive pas � intercepter mon message. En gros....la fen�tre dlg cens�e le r�cup�rer ne re�oit rien au niveau de l'�v�nement OnCopyData. Je ne sais pas pourquoi....d'autant que je suis certains de l'authenticit� de mon handle.
    Alors...est-ce que cela viens de mon envoie ou de ma r�ception...je ne sais pas trop.

  20. #20
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    moi je verais plutot un truc comme ca :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    COPYDATASTRUCT cds; 
    cds.dwData = 0; 
    cds.cbData = (strlen(monmessage)+1) * sizeof(TCHAR); 
    cds.lpData = _alloca(cds.cbData); 
    strcpy((char*)cds.lpData, monmessage); 
     
    SendMessage(WinDvdAt, WM_COPYDATA , 0, (LPARAM) (LPVOID) &cds);
    et apr�s, � l'interception du message :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    PCOPYDATASTRUCT pMyCDS; 
    pMyCDS = (PCOPYDATASTRUCT) lParam;
    char *chaine = (LPSTR) ((char *)(pMyCDS->lpData));

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 1 sur 2 12 Derni�reDerni�re

Discussions similaires

  1. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    R�ponses: 3
    Dernier message: 28/04/2003, 21h49
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & r�seau
    R�ponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    R�ponses: 7
    Dernier message: 29/10/2002, 08h45
  4. R�ponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    R�ponses: 7
    Dernier message: 02/08/2002, 16h11

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