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 :

Récupèrer l'adresse d'un objet se trouvant dans le fichier de l'application


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 246
    Par défaut Récupèrer l'adresse d'un objet se trouvant dans le fichier de l'application
    Bonjour,

    Le projet se nomme Module_test1 c'est un application MFC smart device.

    Je souhaite récupèrer l'adresse d'un objet nommé "serie" qui est déclaré dans le Module_test1.h et l'envoyer dans mon Module_test1View.cpp

    Voici 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
    // Module_test1.h : fichier d'en-tête principal pour l'application Module_test1
     
    class CModule_test1App : public CWinApp
    {
    public:
        CModule_test1App();
     
                 ....
    public:
        cl_Bluetooth serie;
     
        DECLARE_MESSAGE_MAP()
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // Module_test1View.cpp : implémentation de la classe CModule_test1View
    
    void CModule_test1View::OnBnClickedButton1()
    {
    char *recupTRAME=pApp->serie.Lecture();  //pApp est le pointeur sur le fichier Module_test1 mais il m'affiche une erreur lorsque je clique sur lecture gwes.exe
     LPCTSTR tmp=(LPCTSTR)recupTRAME;
         AfficheTrame.AddString(tmp);
    
    }
    Quelle fonction peut fonctionner ?

  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
    salut,
    il y a erreur parce que ton pointeur pApp ne doit pas être valide ...
    ton code ne permet pas de voir son initialisaton...
    qui devrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pApp=static_cast<CModule_test1App *>(AfxGetApp());
    ou alors le probléme vient de ton utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *recupTRAME=pApp->serie.Lecture()
    vu que tu utilises un char * en retour, l'adresse retournée ne doit pas être située dans la pile sinon boum (plus loin)...
    de toute façon plein de bug possible dans ce code pas terrible..
    la chaine retournée se termine par un \0 ? sinon boum dans AddString .
    en conclusion les char * c'est mal si on ne maitrise pas la chose..

  3. #3
    Membre éclairé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 246
    Par défaut Un peu de précision...
    Merci Farscape, ta fonction static_cast<CModule_test1App *>(AfxGetApp()) je l'utilise dans mon constucteur de Module_test1View car j'ai déclaré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Module_test1View.h : interface de la classe CModule_test1View
                        ...
    class CModule_test1View : public CFormView
    {
                   ...
    public:
    	CModule_test1App *pApp;
    Par contre je ne comprend pas pourquoi le type char* pose problème car c'est quand même un type de base du C++. Maintenant il me met plus l'erreur gwes.exe mais il m'affiche rien dans le listbox.

  4. #4
    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 gueulederack
    Par contre je ne comprend pas pourquoi le type char* pose problème car c'est quand même un type de base du C++.
    Citation Envoyé par Farscape
    l'adresse retournée ne doit pas être située dans la pile sinon boum
    ce n'est pas une question de type mais d'utilisation, manipuler des char * est délicat si on est pas habitué à écrire du C, et les pièges sont nombreux ,j'en ai cité deux dans mon post précédent.
    il faudrait voir l'implémentation de ta fonction Lecture().

  5. #5
    Membre éclairé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 246
    Par défaut la méthode Lecture()
    Je te montre de suite ma classe Cl_Bluetooth

    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
    class cl_Bluetooth : public CWnd
    {
    	DECLARE_DYNAMIC(cl_Bluetooth)
     
    public:
    	cl_Bluetooth();
    	~cl_Bluetooth();
        char* Lecture (void);
        void modifPARAM (char *Port,int Brate);
     
    private:
       HANDLE hcomm;
       LPDCB serie;
       OVERLAPPED over;
     
    protected:
    	DECLARE_MESSAGE_MAP()
     
    };
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #include "stdafx.h"
    #include "Module_test1.h"
    #include "cl_Bluetooth.h"
    
    
    // cl_Bluetooth
    
    IMPLEMENT_DYNAMIC(cl_Bluetooth, CWnd)
    //---------------------------------------------------------------------------
    /*                               Partie PDA                                */
    /*                                                                         */
    /*                                                                         */
    /*                        Définition des méthodes de Bluetooth             */
    //---------------------------------------------------------------------------
    cl_Bluetooth::cl_Bluetooth()
    {char *Port=new char (5);
     serie=new DCB();
     int vitesse;
     strcpy(Port,"COM1");
     vitesse=4800;
     modifPARAM (Port,vitesse);
    }
    //-------------------------------------------------------------------------
    cl_Bluetooth::~cl_Bluetooth()
    {		/* Destructeur */
    bool test;
     test=PurgeComm (hcomm,PURGE_RXCLEAR);
     if (test==true)
       {test=CloseHandle (hcomm); //fermeture du port
       }
     else
       {MessageBox(TEXT("Impossible de vider le port com"),TEXT("Erreur #003"),MB_ICONSTOP);
       }
    }
    //-----------------------------------------------------------------------------
    char* cl_Bluetooth::Lecture ()
    /* Lecture des données sur le port */
    {bool test;
     unsigned long pt=0;
     char chaine[100];
     test=ReadFile(hcomm,&chaine,82,&pt,&over); //lecture du port série
     strcat (chaine,"\0");
     if (test==false)
       {MessageBox(TEXT("Impossible de lire sur le port com"),TEXT("Erreur #004"),MB_ICONSTOP);
       }
     PurgeComm (hcomm,PURGE_RXCLEAR); // vide le buffer du port
     return chaine; //on retourne la trame NMEA
    }
    //---------------------------------------------------------------------------
    void cl_Bluetooth::modifPARAM (char *Port,int vitesse)
    /* Modification des paramètres du port série */
    {LPWSTR wch;
     strcat(Port,":");
     int Size = MultiByteToWideChar (CP_ACP, 0, Port, -1, NULL, 0);
     wch = new WCHAR[Size];
     MultiByteToWideChar (CP_ACP, 0, Port, -1, wch, Size); 
    
     bool test;
     hcomm=CreateFile(wch,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); //ouverture du port sélectionné
     if(hcomm==INVALID_HANDLE_VALUE) 
      {MessageBox(TEXT("Impossible d'ouvrire le port choisi"),TEXT("Erreur #001"),MB_ICONSTOP);
      }
     GetCommState (hcomm,serie); //lecture des paramètre de configuration du port
     serie->BaudRate=vitesse;
     serie->ByteSize=8;
     serie->Parity=NOPARITY;
     serie->StopBits=0;
     test=SetCommState (hcomm,serie); //fin de la configuration
     if (test==false)
       {MessageBox(TEXT("Impossible d'ouvrire le port choisi"),TEXT("Erreur #002"),MB_ICONSTOP);
       }
      PurgeComm (hcomm,PURGE_RXCLEAR);  //vider le buffer
    }
    De plus j'ai l'habitude d'utiliser les char* car j'ai débuter laz prog avec le llangage C avec devcpp. Mais c'est vrai que rien n'est automatique. ^^

  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
    oué c'est bien ce que je disais...
    ta variable char chaine[100]; est bien dans la pile.
    a la sortie d'une fonction les variables dans la pile sont nettoyées,
    ce sont les base du C ça...
    de toute façon ton code est truffé de bugs, comme le
    strcat (chaine,"\0");
    et je ne suis pas allé plus loin dans la lecture..


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

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/02/2013, 16h09
  2. Récupérer un objet se trouvant dans une autre fonction
    Par Shinochi dans le forum Débuter
    Réponses: 4
    Dernier message: 03/10/2010, 18h30
  3. Réponses: 2
    Dernier message: 16/07/2007, 14h13
  4. Réponses: 7
    Dernier message: 06/01/2007, 20h16
  5. Monter une partition se trouvant dans un fichier
    Par Celelibi dans le forum Administration système
    Réponses: 3
    Dernier message: 02/04/2006, 18h56

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