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 :

[MFC] probleme avec CFile


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Points : 50
    Points
    50
    Par défaut [MFC] probleme avec CFile
    Je souhaite utiliser la classe CFile présente dans les MFC pour créer les fichiers relatifs a mon application.

    j'ai testé le code fourni par MSDN:

    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
    HANDLE hFile = CreateFile(_T("C:\\MyFile.DAT"),
             GENERIC_WRITE, FILE_SHARE_READ,
             NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
     
       if (hFile == INVALID_HANDLE_VALUE)
          AfxMessageBox(_T("Couldn't create the file!"));
       else
       {
          // Attach a CFile object to the handle we have.
          CFile myFile(hFile);
     
          static const char sz[] = "Hockey is best!";
     
          // write string, without null-terminator
          myFile.Write(sz, lstrlen(sz));
     
          // We can call Close() explicitly, but the destructor would have
          // also closed the file for us. Note that there's no need to
          // call the CloseHandle() on the handle returned by the API because
          // MFC will close it for us.
          myFile.Close();
       }

    mais j'obtiens l'erreur suivante a la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2664: '__thiscall CFile::CFile(int)' : cannot convert parameter 1 from 'void *' to 'int'
    La j'avoue que je ne comprends pas trop...

    Je sais qu'il y'a moyen de se passer du Handle en prenant l'autre constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CFile(
       LPCTSTR lpszFileName,
       UINT nOpenFlags 
    );
    mais j'ai besoin de modifier les attributs du fichier créé et la méthode avec le Handle le permet...

    Est ce que quelqu'un a déja été confronté au probleme??? C'est surement tres simple mais je vois pas. Merci d'avance

  2. #2
    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
    salut,

    pas besoin de faire un CreateFile pour avoir un handle de fichier

    Si tu utilises CFile, tu peux disposer de la variable membre m_hFile qui te donne le handle

  3. #3
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Points : 50
    Points
    50
    Par défaut
    Vu, mais est ce qu'on peut modifier les attributs du fichier créé (Fichier temporaire, caché, ...)??

    Aurais tu une idée pour résoudre ce problème en utilisant qd meme la méthode CreateFile??

    Merci

  4. #4
    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
    tu utilises soit CreateFile (version API), soit CFile (MFC), mais pas les deux en meme temps.

    Si tu utilises CreateFile, il faut que tu utilises le handle retourné par CreateFile dans la fonction GetFileAttributes
    Si tu utilises CFile, il faut que tu utilises la variable membre qui donne le handle du fichier

  5. #5
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par nico-pyright(c)
    tu utilises soit CreateFile (version API), soit CFile (MFC), mais pas les deux en meme temps.
    La je comprends plus rien, dans l'exemple de la MSDN, ils donnent un constructeur qui permet d'attacher l'objet CFile au handle donné par CreateFile... (cf extrait de code dans mon premier message).

    Désolé d'etre insistant, mais je débute et je voudrais etre sur de comprendre....

  6. #6
    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
    ben, je ne sais pas, ca me parait bizarre qu'il prone le mélange des deux (bien qu'il soit possible, ca oblige de maitriser le code du CFile, ce qui n'est pas le but)

    Pour ton problème, il suffit de caster en int
    à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CFile myFile((int)hFile);
    mais à mon avis, il aurait été plus judicieux d'utiliser le deuxieme constructeur plutot que de faire 2 opérations

  7. #7
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Points : 50
    Points
    50
    Par défaut
    Tu as peut etre raison, mais j'ai besoin de mettre au moins l'attribut caché et la classe CFile ne comporte pas de méthode permettant de le faire (à ma connaissance)...

    Avec le cast, ca marche... (ca veut dire que le code de la msdn comporte un erreur????)

    Merci beaucoup!!!

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    As-tu essayé CFile::SetStatus()?
    Cette méthode prends un Objet de type CFileStatus, qui comporte un paramètre (de type BYTE) qui permet de déterminer le status:

    Citation Envoyé par msdn
    enum Attribute {
    normal = 0x00,
    readOnly = 0x01,
    hidden = 0x02,
    system = 0x04,
    volume = 0x08,
    directory = 0x10,
    archive = 0x20
    };
    hope it helps

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Pour ton problème, il suffit de caster en int à savoir:
    CFile myFile((int)hFile);
    Ca marche mais n'explique pas pourquoi ça ne marchait pas avant!
    CreateFile renvoie un HANDLE et le constructeur de CFile prend comme argument un HANDLE dixit msdn. Alors ?

  10. #10
    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
    salut,
    tu peux constater ici http://msdn.microsoft.com/library/de...3a3a.cfile.asp que le constructeur de CFile peut etre celui-ci
    Citation Envoyé par msdn
    CFile( int hFile );
    hFile : The handle of a file that is already open.

  11. #11
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Points : 50
    Points
    50
    Par défaut
    ben oui justement, il y a donc une erreur dans la msdn concernant ce contructeur car d'apres ce que j'ai compris HANDLE est de type void* or, le constructeur de CFile attend un integer... Allez comprendre?!?!

  12. #12
    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
    oui, mais ce n'est pas trop grave, puisque un handle est un nombre, donc l'integer est tout à fait capable de le stocker, d'autant plus qu'ils font 4 octets tous les deux.
    Mais je reconnais que sémantiquement, c'est un peu étrange

  13. #13
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Points : 50
    Points
    50
    Par défaut
    Merci beaucoup en tout cas...

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

Discussions similaires

  1. [MFC] Probleme avec CDialog
    Par le-makinero dans le forum MFC
    Réponses: 2
    Dernier message: 19/04/2006, 11h15
  2. [MFC] probleme avec le ClassWizard
    Par moulefrite dans le forum MFC
    Réponses: 3
    Dernier message: 31/03/2006, 16h54
  3. Probleme avec CFile
    Par azrael88370 dans le forum MFC
    Réponses: 7
    Dernier message: 13/03/2006, 13h02
  4. [MFC]Probleme avec attributs d'une LOGFONT
    Par Fildz dans le forum MFC
    Réponses: 3
    Dernier message: 08/01/2006, 18h59
  5. Réponses: 18
    Dernier message: 06/10/2005, 10h09

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