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 :

APi Win32 GetFileSizeEx


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Par défaut APi Win32 GetFileSizeEx
    Bonjour à tous,

    Je découvre totalement la programmation avec l'API Win32.
    J'avais auparavant posté dans une autre catégorie et il est ressorti qu'il fallait que j'utilise l'API Windows pour résoudre mes problèmes (adressage et positionnement d'un pointeur dans des fichiers pouvant excèder 4 Go).

    Ne conaissant que très peu l'API, je doit omettre quelquechose car je ne parviens pas à compiler.
    De plus je ne sais pas comment lier une librairie, ce n'est pas très clair pour moi.

    Voici le code qui pose problème:

    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
    #include <cstdlib>
    #include <iostream>
    #include <Windows.h>
    #include <WinBase.h>
    
    using namespace std;
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    HANDLE monfichier=CreateFile("C:\\Users\\Aurelien\\Documents\\Progra\\fich\\test.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
    //HANDLE hfic=CreateFile(fichier,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
    char tab[2] = "A";
    string texte = "montexte";
    SetFilePointer(monfichier, 0, NULL, FILE_END);
    WriteFile(monfichier,&texte,sizeof(texte),NULL,NULL);
    
       LARGE_INTEGER t;
       BOOL taille=GetFileSizeEx(monfichier,&t);
    
        //sprintf(tab, "taille égale %d",taille);
        if(monfichier==INVALID_HANDLE_VALUE){
            MessageBox(NULL,tab,"erreur",MB_OK| MB_ICONEXCLAMATION);
        }
        return 0;
    }
    La compilation bloque à la ligne de GetFileSizeEx.
    J'ai ajouté dans l'éditeur de lien "libkernel32.a" présent dans le repertoire lib de DevC++.
    Dois-je linker des DLL? Sont elles chargées automatiquement? Les librairies ne sont elles pas présentes sous Windows?

    J'ai lu sur le site qu'il fallait un SDK, mais je ne comprends pas pourquoi étant donné que l'API fait parti de Windows, de plus le lien était pour Windows Server 2003.

    Si quelqu'un peut m'expliquer ce qui ne va pas et comment je dois procéder car j'ai beau chercher je ne comprends pas vraiment.
    Merci

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par devdebutantajax Voir le message
    Je découvre totalement la programmation avec l'API Win32.
    Bienvenue au club, tu verras, au début, cela pique les yeux mais après, c'est super.

    Citation Envoyé par devdebutantajax Voir le message
    La compilation bloque à la ligne de GetFileSizeEx.
    Quel est le message d'erreur (complet s'il te plait) ?

    Citation Envoyé par devdebutantajax Voir le message
    J'ai ajouté dans l'éditeur de lien "libkernel32.a"
    Non, tu n'est pas sous unix. Si tu devais te linker avec une librairie, l'extension serait surement .lib

    Citation Envoyé par devdebutantajax Voir le message
    Dois-je linker des DLL?
    Non, une DLL est du code chargée au moment de l'exécution du programme. Tu n'a jamais besoin des DLL lors de la compilation ni du link. Par contre, tu as besoin des librairies (.lib) qui permettent d'utiliser ces DLL. Dans ton cas, cette librairie, c'est kernel32.lib. Je ne connais pas ton environnement de développement mais souvent, le link avec cette librairie est par défaut donc tu n'as pas besoin de le spécifier.

    Citation Envoyé par devdebutantajax Voir le message
    Sont elles chargées automatiquement?
    Oui, c'est le rôle du loader de programme. Dans certains cas très spécifiques, elles peuvent être chargées et déchargées à la demande mais tu n'en est pas encore là.

    Il faut tester le retour de tes fonctions (SetFilePointer() par exemple). C'est pas grave dans ce cas présent mais c'est une bonne habitude à prendre

    L'utilisation de la fonction WriteFile n'est pas correcte.
    • Le 2eme paramètre est un pointeur (void *) de la zone mémoire qu'il faut écrire. Ici, tu passes l'adresse d'un objet std::string. Cela n'a rien à voir.
    • Le 3eme paramètre est l'adresse d'un DWORD pour indiquer en retour le nombre d'octets écrits. Il ne peut être NULL que dans un seul cas, les écritures Overlapped (concept avancé), donc dans ton cas, il faut passer l'adresse d'une valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char *txt = "montexte";
    DWORD nb_write;
       if(WriteFile(monfichier, txt, strlen(txt), &nb_write, NULL) == FALSE)
       {
          MessageBox(NULL, tab, "erreur", MB_OK | MB_ICONEXCLAMATION);
       }
    ou encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DWORD nb_write;
       if(WriteFile(monfichier, "montexte", strlen("montexte"), &nb_write, NULL) == FALSE)
       {
          MessageBox(NULL, tab, "erreur", MB_OK | MB_ICONEXCLAMATION);
       }
    Le test que tu fais en fin de main (if(monfichier==INVALID_HANDLE_VALUE)...), il serait mieux juste apès l'ouverture du fichier.

    Sinon, à part cela, le programme est bon et le résultat obtenu est correct
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Par défaut
    Bonjour,

    Franchement je tiens déjà à te remercier pour le temps que tu passes à m'aider.

    Alors pour le code j'ai mis un peu en vrac les tests c'était pour déterminer d'où pouvait venir l'erreur.
    Cette erreur justement: 22 C:\Users\Aurelien\Documents\Progra\fich\main.cpp `GetFileSizeEx' undeclared (first use this function).

    Pourtant j'ai regardé dans le linker j'ai bien le chemin vers devCpp/include pour les fichier ".h".
    J'ai cherché depuis que j'ai posté sur le forum, et je ne parviens toujours pas à trouver le problème avec cette fonction. J'ai installé le fameux SDK, j'ai rajouté les liens vers celui-ci, mais rien n'y fait. windows.h est bien présent dans le rep include de DevCpp (idem pour winbase.h)

    J'ai aussi essayé sous Microsoft Visual C++ 2005 et cette fois j'ai fatal error C1083: Impossible d'ouvrir le fichier include*: 'Windows.h'*: No such file or directory. J'ai essayé de rajouter un lien dans le linker mais je n'ai pas réussi dans propriétés du projets et "editeur de liens" je ne trouve rien pour ajouter un chemin.
    EDIT: Je suis parvenu à jouter le chemin du SDK (repertoire include) dans ajouter une bibliothèque supplémentaire dans propriétés projet -> editeur de lien -> général -> Repertoires de bibliothèque supplémentaire; Mais toujours la même erreur.

    Merci encore

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    En tout premier dans ton code avant les include, ajoute pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef _WIN32_WINNT		// Autorise l'utilisation des fonctionnalités spécifiques à Windows*XP ou version ultérieure.                   
    #define _WIN32_WINNT 0x0501	// Attribuez la valeur appropriée à cet élément pour cibler d'autres versions de Windows.
    #endif
    Si cela marche, dis le et je t'explique après.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Par défaut
    Alors ça compile sous DevC++ mais pas sous Visual Express, mais bon c'est pas très grave à la limite.

    Oui je veux bien que tu m'expliques ce qui a semble-t-il résolu le problème.

    J'ai regardé quelques codes sources programmé avec l'API est j'avoue que je vois beaucoup de code pour déclarer diverses "choses" mais je ne saisi vraiment pas. L'apprentissage risque d'être compliqué, mais si ça vaut la peine alors je passerais par là.

    Merci à toi

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je pense que tu as un problème dans l'ordre de tes répertoires include.
    Il faut que tu aies en premier le répertoire des include du SDK puis en 2eme ceux livrés par ton compilateur.

    Dans mon cas, cela donne:
    • C:\Program Files\Microsoft Platform SDK\Include
    • C:\Program Files\Microsoft Visual Studio 8\VC\include
    • C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include
    • C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include
    • C:\Program Files\Microsoft DirectX SDK (April 2007)\Include
    • C:\Program Files\boost\include\boost-1_33_1

    C'est la même chose pour les libraries. Il y a un ordre dans les répertoires de recherche et il faut mettre le même que pour les include (le répertoire des librairies du SDK avant le répertoire des librairies de ton compilateur)

    Les includes livrés avec ton compilateurs ne sont pas forcemment les derniers. L'install du SDK permet d'avoir les dernière librairies ainsi que les derniers include files. C'est pour cela que l'ordre est très important.

    Je suppose que dans ton cas, le fichier winbase.h que tu utilises est celui délivré avec ton compilateur et que dedans, il doit y avoir quequchose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #if(_WIN32_WINNT >= 0x0400)
    WINBASEAPI
    BOOL
    WINAPI
    GetFileSizeEx(
        __in  HANDLE hFile,
        __out PLARGE_INTEGER lpFileSize
        );
    #endif // #if (_WIN32_WINNT >= 0x0400)
    et comme tu ne définissait pas _WIN32_WINNT (ce que je t'ai fait rajouter), la fonction GetFileSizeEx() n'était pas déclarée.

    La déclaration de la constante _WIN32_WINNT permet de gérer les fonction qui existe dans certaine version et pas dans d'autres.

    Je pense aussi que si tu utilises les includes du SDK en premier, ce problème disparait.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

Discussions similaires

  1. [Débutant]Quelques questions de principe sur l'API win32
    Par silver_dragoon dans le forum Windows
    Réponses: 4
    Dernier message: 19/03/2004, 18h38
  2. [API WIN32] Pb avec SHGetSpecialFolderLocation
    Par Invité dans le forum MFC
    Réponses: 3
    Dernier message: 27/01/2004, 21h19
  3. [API Win32] WriteFile()
    Par tut dans le forum MFC
    Réponses: 2
    Dernier message: 27/01/2004, 16h13
  4. API Win32
    Par benoit70 dans le forum MFC
    Réponses: 8
    Dernier message: 26/01/2004, 19h11
  5. [API win32] Récupérer le répertoire d'un profile
    Par sbeu dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/09/2002, 12h38

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