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

Windows Discussion :

Probleme CreateFile, ReadFile et WriteFile Windows98


Sujet :

Windows

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut Probleme CreateFile, ReadFile et WriteFile Windows98
    Bonjour tout le monde...

    Voila mon petit probleme:

    Je réalise un logiciel pour windows. Lors du lancement le logiciel doit charger différents paramètres qui seront sauvegarder lors de la fermeture du logiciel (normal...) .
    Le logiciel ne devant tourner que pour windows, je me suis dit "Ben je vais utiliser l'API Windows!!!" (très bien foutu en général) .
    Alors que tout se passe correctement sous windowsXP, rien ne se passe sous windows98...

    Voici le code de chargement des donneés:

    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
    void CApplication::LoadData()
    {
        HANDLE data;
        data = CreateFile("Data\\InitData.eas",0,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        if( data != INVALID_HANDLE_VALUE)
        {
            data = CreateFile("Data\\InitData.eas",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
            int buf1;
            float buf2;
            buf1=0;
            buf2=0.0;
            unsigned long ultemp;
            ReadFile(data,  &buf1,sizeof(buf1),&ultemp,NULL);
            m_Long=buf1;
            ReadFile(data,  &buf1,sizeof(buf1),&ultemp,NULL);
            m_Larg=buf1;
            ReadFile(data,  &buf1,sizeof(buf1),&ultemp,NULL);
            m_X=buf1;
            ReadFile(data,  &buf1,sizeof(buf1),&ultemp,NULL);
            m_Y=buf1;
            ReadFile(data,  &buf2,sizeof(buf2),&ultemp,NULL);
            m_Separation=buf2;
            ReadFile(data,  &buf2,sizeof(buf2),&ultemp,NULL);
            m_Separation2=buf2;
        }
        else
        {
            data = CreateFile("Data\\InitData.eas",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
            int buf1;
            float buf2;
            unsigned long ultemp;
            buf1 = 600;
            WriteFile(data,  &buf1,sizeof(buf1),&ultemp,NULL);
            buf1 = 400;
            WriteFile(data,  &buf1,sizeof(buf1),&ultemp,NULL);
            buf1 = (GetDeviceCaps(GetDC(NULL), HORZRES) - 600) / 2;
            WriteFile(data,  &buf1,sizeof(buf1),&ultemp,NULL);
            buf1 = (GetDeviceCaps(GetDC(NULL), HORZRES) - 400) / 2;
            WriteFile(data,  &buf1,sizeof(buf1),&ultemp,NULL);
            buf2 = 0.66;
            WriteFile(data,  &buf2,sizeof(buf2),&ultemp,NULL);
            buf2 = 0.5;
            WriteFile(data,  &buf2,sizeof(buf2),&ultemp,NULL);
        }
    
        CloseHandle(data);
    }
    Si le fichier existe, on le lit sinon on le crée avec des valeurs par défauts. Sous XP, tout est OK. Sous 98, si le fichier n'existe pas, il n'est pas créé et si je met un fichier créé sous XP, les valeurs chargées sont mauvaises...

    Note: j'ai aussi essayé avec GENERIC_READ_DATA et GENERIC_WRITE_DATA comme mode d'accès dans CreateFile.

    Mais que se passe-t-il donc????

    Merci d'avance.

    Jean

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    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 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Mauvais forum, faudrait poster sur developement Windows ou peut être VC++ car tu sembles faire des MFC, et tu pourrais utiliser CFile par exemple.
    Mais avant de déplacer, j'ai envie de te demander pourquoi ne pas utiliser le C++ standard ?
    http://c.developpez.com/faq/cpp/?pag...ERS_read_write
    pour "les valeurs chargées sont mauvaises", qu'es-tu censé obtenir ? Que veux-tu avoir dans ton fichier ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Mauvais forum, faudrait poster sur developement Windows ou peut être VC++ car tu sembles faire des MFC, et tu pourrais utiliser CFile par exemple.
    MFC??? Mis à part le nom, je n'y connais pas grand chose et ce serait bien malgré moi. En fait ce programme me sert d'apprentissage "sur le tas" de l'API.
    J'utilise l'excellent Code::Blocks avec MiniGW, mais il est vrai que je mélange un peu (beaucoup même) la syntaxe des compilateurs.

    pourquoi ne pas utiliser le C++ standard ?
    C'est ce que j'ai fait jusqu'à présent. Ici, je me suis dit que l'API windows devait être plus efficace si mon programme tourne uniquement sur windows.
    Tu me conseille donc de programmer en C++ standard et de n'utiliser l'API que pour les fonctions plus complexes, c'est ça?

    pour "les valeurs chargées sont mauvaises", qu'es-tu censé obtenir ? Que veux-tu avoir dans ton fichier ?
    En fait ce fichier contient la position de la fenetre (m_X et m_Y), sa taille (m_Long et m_Larg), ainsi que deux parametres me permettant de positionner les autres controles dans la fenetres (m_Separation et m_Separation2). Sous 98, si le fichier n'existe pas, il n'est pas créé et la fenetre est tout le temps à sa position d'origine. Si j'ai placé un fichier créé sous XP, la fenetre est créé mais elle se place en haut à guauche et à une taille minimale. Les valeurs chargées semblent donc être nulles. (A noter que le constructeur de la classe CApplication (qui contient m_X, m_Y,...) les initialise à des valeurs non nulles. Ils sont donc bien modifier par mes ReadFile.

    NB: comme je l'ai dit mon but est de comprendre l'erreur de mon code et non de le faire marcher. Le déplacer vers le topic Développement Windows est donc une bonne idée.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    1°) Vérifie le répertoire courant, ce n'est peut-être pas le même (GetCurrentDirectory() avec l'API Windows)

    2°) si le fichier existe, tu perds le handle: tu devrais supprimer le second CreateFile et ajouter GENERIC_READ dans le premier ("si tu arrives à l'ouvrir en lecture, tu le lis, sinon, tu en crées un nouveau")

    Sinon, je ne vois pas trop pourquoi il n'est pas créé dans le second cas... remplace peut-être OPEN_ALWAYS par CREATE_ALWAYS, mais normalement, ce n'est pas ça qui devrait changer grand-chose...

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    2°) si le fichier existe, tu perds le handle: tu devrais supprimer le second CreateFile et ajouter GENERIC_READ dans le premier ("si tu arrives à l'ouvrir en lecture, tu le lis, sinon, tu en crées un nouveau")
    C'est fait. -> ça ne change rien au probleme, mais donne un code plus clair

    Je viens de trouver l'erreur. Si je créé mon fichier dans le répertoire courant aucun probleme. Par contre, si je le crée sous "Data/fichier" celà ne marche pas (sous 98 ). Je vais donc jongler entre les CreateDirectory et les SetCurrent Directory.

    Ce qui m'amène à une dernière question (de C++ cette fois-ci):
    les CHAR* me font peur!!!!!! Je lit partout "ne pas utiliser les char*, etc..." (cf la citation de aurélien (n'as tu pas honte de me faire peur!)). J'utilise donc les std::string.
    Pourtant GetCurrentDirectory a besoin d'un char*.

    Voici mon code : (m_AppDirectory est une std::string)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        char* temp;
        temp = new char[250];
        GetCurrentDirectory(250,temp);
        m_AppDirectory = temp;
        delete[] temp;
    Qu'en pensez-vous?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Avec les MFC, il y aurait CString::GetBuffer(), mais pour std::string, je ne vois aucune fonction renvoyant un accès en écriture à ces données...

    string::reserve() ne renvoit rien... c_str() et data() renvoient toutes les deux un pointeur constant...

    Résultat, je ne vois pas bcp d'autres solutions qu'un tableau de char ou TCHAR...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char rep[MAX_PATH];
    GetCurrentDirectory(MAX_PATH, rep);
    (Et bien sûr, le rappel: en utilisant des TCHARs, ne surtout pas utiliser directement sizeof(rep) !

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Un tout simple char rep[MAX_PATH]? OK ça me va. (J'avoue des fois faire tres compliqué alors que je sais que plus simple pourrais peut etre aller.Mais quand j'ai peur, je prend mes précautions.)

    OK, merci. C'est quand même bizare ce CreateFile qui ne veut pas me créer de répertoire (j'ai rien vu dans le SDK pourtant). En éspérant que CreateDirectory marche sans probleme.

    Merci à tous!

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

Discussions similaires

  1. Réponses: 52
    Dernier message: 27/03/2009, 18h11
  2. CreateFile,WriteFile et ReadFile
    Par stou05 dans le forum Windows
    Réponses: 1
    Dernier message: 22/05/2007, 15h48
  3. Probleme avec CreateFile
    Par le-makinero dans le forum MFC
    Réponses: 3
    Dernier message: 14/04/2006, 13h35
  4. API ReadFile et WriteFile, comment l'utiliser ?
    Par AsmCode dans le forum MFC
    Réponses: 2
    Dernier message: 04/08/2005, 23h25
  5. probleme avec writefile
    Par exter666 dans le forum C++
    Réponses: 10
    Dernier message: 16/03/2005, 12h58

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