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 du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    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 éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    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 éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    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
    Points : 17 323
    Points
    17 323

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    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 éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    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 éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    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 éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    Par défaut
    C'est une très bonne idée ça !

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    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
    Points : 16 075
    Points
    16 075
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    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
    Points : 16 075
    Points
    16 075
    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