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

C++ Discussion :

API Windows WriteFile: marche mais retourne 0


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Points : 23
    Points
    23
    Par défaut API Windows WriteFile: marche mais retourne 0
    Bonjour,
    J'ai une fonction qui fait presque bien sont travail: le résultat d'écriture est bon mais le retour de la fonction WriteFile est 0 (donc false) et le nombre de Bytes écrit reste à zéro, j'utilise QT pour la lecture du fichier.
    Remarque le fichier contenant des données à écrire contient des "\0"
    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
     
    boolean MyClass::writeFromFile(QString filepath)
    {
        Log *log = Log::getInstance();
        qDebug() << "Openning file " << filepath;
        QFile file(filepath);
        if (!file.open(QIODevice::ReadOnly))
        {
            qDebug() << "Error: File "<< filepath << " not found";
            log->info("Error: File " + filepath + " not found");
            return false;
        }
     
        qDebug() << "File "<< filepath << " found";
        log->info("File " + filepath + " found");
     
        QByteArray buffer = file.readAll();
        file.close();
     
        openBatDevice();
        int retData = SetFilePointer(_batDevice, 0, NULL, FILE_BEGIN);
        if (retData == 0xFFFFFFF)
        {
            qDebug() << "Error: SetFilePointer is 0xFFFFFFF";
            log->info("Error: SetFilePointer is 0xFFFFFFF");
            return false;
        }
     
        DWORD nbOfByteWr;
        LPDWORD nNumberOfBytesToWrite;
     
        BYTE* data = (BYTE*) buffer.data();
     
        DWORD dwLen = strlen(buffer.data());
     
     
        DWORD dwBytesRead = (DWORD) buffer.size();
     
        qDebug() << "INFO buffer data: " << buffer.data();
        qDebug() << "INFO buffer size: " << buffer.size();
     
     
        BOOL out = WriteFile(_batDevice, data, dwBytesRead, &nbOfByteWr, NULL);
     
        qDebug() << "INFO out: " << out;
     
        qDebug() << "INFO nbOfByteWr: " << nbOfByteWr;
     
     
        int errorId = (int) GetLastError();
        qDebug() << "Error WriteSector : " + QString::number(errorId);
        qDebug() << "Error WriteSector : " + errorId;
     
     
     
    }

    Retours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Openning file  "C:/Users/user/Documents/Projet/Project/Outils_project/projectExe/debug/clef_XXX.img"
    File  "C:/Users/user/Documents/Projet/Project/Outils_project/projectExe/debug/clef_XXX.img"  found
    INFO buffer data:  
    INFO buffer size:  4198400
    INFO out:  0
    INFO nbOfByteWr:  0
    Error WriteSector : 
    Error WriteSector :

    Merci d'avance! je sèche

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    - Pourquoi ne pas utiliser Qt pour écrire le fichier ? Ou simplement un fstream ?
    - Quelle est l'erreur de GetLastError ? Ta sortie est totalement vide.
    - Es-tu sûr que ton handle et donc l'écriture ne serait pas asynchrone ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Hello,
    Merci pour ton retour
    Citation Envoyé par Bousk Voir le message
    - Pourquoi ne pas utiliser Qt pour écrire le fichier ? Ou simplement un fstream ?
    En fait je n'écris pas dans un fichier mais j'écrase les données d'une clef USB, sinon oui je vais creuser pour le faire en Qt ou fstream (solution de contournement), passer par Qt ou fstream changerai trop de choses dans le codes donc je ne préfère pas.
    je ne comprend pas pourquoi ça ne marche pas en c++ avec WriteFile alors qu'en C# ça fonctionne sans erreur.

    Citation Envoyé par Bousk Voir le message
    - Quelle est l'erreur de GetLastError ? Ta sortie est totalement vide.
    En effet c'est bien le retour que j'ai eu, en mode debug je trouve la valeur 0

    Citation Envoyé par Bousk Voir le message
    - Es-tu sûr que ton handle et donc l'écriture ne serait pas asynchrone ?
    Alors j'ai regardé comment le fichier source est lu, et c'est bien du synchrone. sinon y-a-t'il un moyen de le détecter?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadFile(_batDevice, buffer, toRead, &read, NULL)

    Merci bien

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    D'abord, vu qu'on a aucune info sur comment tu crées ton handle, et que tu ne sembles pas maîtriser totalement le code en question, on ne sait pas s'il est asynchrone ou non.
    Ensuite, pourquoi mélanger API Windows dans un projet Qt ?! Tout faire avec l'interface Qt, ou à défaut la std, ça épargne des problèmes...
    Enfin, ta sortie n'a pas grand sens, GetLastError doit afficher quelque chose, au moins 0, et non rien du tout tel qu'actuellement. Peut-être que le cast cavalier en int n'aide pas. Et s'il retourne 0, c'est qu'il n'y a pas d'erreur.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Merci Bousk pour ton aide,

    Alors voici comment est créé le Handle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _batDevice = CreateFile(devicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    Dans la doc https://docs.microsoft.com/... je lis qu'il faut utiliser le flag FILE_FLAG_OVERLAPPED pour être asynchrone donc je pense que c'est du synchrone, non?

    sachant que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define CreateFile __MINGW_NAME_AW(CreateFile)
    et que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WINBASEAPI HANDLE WINAPI CreateFileW (LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
    Ensuite je ne suis pas l'auteur du code, le choix de mixer Qt et API Windows m'a été imposé

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Peut-on aussi voir le test fait par le code pour vérifier que l'appel à CreateFile() a réussi?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 29
    Dernier message: 14/01/2013, 10h40
  2. tutoriel : La programmation de l'API Windows en C++ par Bob
    Par Aurelien.Regat-Barrel dans le forum Windows
    Réponses: 19
    Dernier message: 21/06/2008, 14h34
  3. [API windows] RegisterClassEx échoue et marche !
    Par Heliopraetor dans le forum Windows
    Réponses: 10
    Dernier message: 10/08/2007, 09h56
  4. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  5. Utilisation de Pointeurs dans API windows
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 13/03/2003, 22h39

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