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 :

probleme sur api


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 126
    Par défaut probleme sur api
    bonjour a tous voila j'ai un petit souci de compilation avec une api voila le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
    #include <stdlib.h>
    #include<windows.h>
     
    int main(int argc, char *argv[])
    {
      LPCSTR *bu[100];
      FindFirstVolume(&bu,100);
      system("PAUSE");	
      return 0;
    }
    j'obtien cette erreur bizarre

    Compilateur: Default compiler
    Building Makefile: "C:\Users\miki\Desktop\Makefile.win"
    Exécution de make...
    make.exe -f "C:\Users\miki\Desktop\Makefile.win" all
    gcc.exe -c tes.c -o tes.o -I"C:/Dev-Cpp/include"

    gcc.exe tes.o -o "test.exe" -L"C:/Dev-Cpp/lib"

    tes.o(.text+0x45):tes.c: undefined reference to `FindFirstVolume'
    collect2: ld returned 1 exit status

    make.exe: *** [dddd.exe] Error 1

    Exécution terminée

    j'ai était faire un chtit tour dans winbase et la fonction FindFirstVolume y et bien déclarer alors si quelqu'un pouvait m'éclairer sur le pourquoi du comment de l'erreur de compilation ça serai sympa merci d'avance

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Je n'ai pas Windows mais suis surpris par ton code, un programmeur Windows confirmera mais est ce qu'il ne faudrait pas plutôt écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdlib.h>
    #include <windows.h>
     
    int _tmain (void)
    {
      TCHAR bu[100];
      FindFirstVolume (bu,100);
      system ("PAUSE");	
      return 0;
    }
    ?

  3. #3
    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
    Effectivement le code de nicolas.sitbon est meilleur.

    Juste je modifierais (afin de m'affranchir des versions unicode/non unicode)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindFirstVolume (bu, sizeof(bu) / sizeof(bu[0]));
    Sinon, pour ton problème de link, il faut lier avec la librairie Kernel32.lib.

    Voir ici pour plus d'info.
    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
    .

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 126
    Par défaut
    Merci d'avoir répondu , oui je doit l'avouer je débute alors dessole pour le code un peu fouillis, sinon c'est quoi la différence entre le code de Nicolas.sitbon a savoir juste le int _tmain (void) par rapport a la fonction main classique je débute je le répète si vous pouviez m'expliquer merci par avance en attendant je teste le code de Nicolas.sitbon merci pour vos explications

  5. #5
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    si je ne dis pas de bêtise, je passe un (TCHAR*) alors que toi tu passes un (TCHAR***), or cette fonction prend en premier paramêtre un LPTSTR soit un (TCHAR*).

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par chuko Voir le message
    tes.o(.text+0x45):tes.c: undefined reference to `FindFirstVolume'
    collect2: ld returned 1 exit status
    Bien que ce soit une fonction bien connue de l'api Win32, même en ajoutant libKernel32.a (kernel32) au projet, je n'ai pas cette fonction avec MinGW. Bizarre...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 126
    Par défaut
    oui je me demande si ce n'est pas un beug ou un problème du a dev c++ c'est quand même bizarre étant donne que la fonction est déclarer dans winbase.Encore un chose Emmanuel Delahaye peut tu m'eclairer sur cette histoire de unicode et non unicode car j'ai vu cela sur la msdn mais je n'ai pas comprit merci par avance.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par chuko Voir le message
    Encore un chose Emmanuel Delahaye peut tu m'eclairer sur cette histoire de unicode et non unicode car j'ai vu cela sur la msdn mais je n'ai pas comprit merci par avance.
    Oui, pourquoi moi ?

    Les chaines C standard classiques utilisent un tableau de char.
    Les chaines C standard étendues utilisent un tableau de wchar_t. C'est requis par les codages étendus comme Unicode, qui supportent toutes les langues écrites du monde, et même le 23 caractères du Klingon...

    Microsoft, par un jeu astucieux de macros permet décrire du code portable qui permet de coder dans un mode ou dans un autre en foncion de de la configuration, et ce sans modifier le code source(_tmain(), TCHAR etc.)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 126
    Par défaut
    lol oui enfin je te demandai car tu l'a mentionner pour mon souci j'ai trouver la réponse grâce a la reponse trouver sur un autre forum je poste cette derniere pour explication

    FindFirstVolume() n'est disponible que dans Windows 2000 et suivants. Il faudra donc permettre au compilateur de la reconnaitre en ajoutant avant les includes:
    #define _WIN32_WINNT 0x0500

    apres cela ça marche impec merci a tous pour toutes vos explications et pour le temps que vous m'avez accorder

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par chuko Voir le message
    lol oui enfin je te demandai car tu l'a mentionner pour mon souci
    Non, c'est Nicolas...
    FindFirstVolume() n'est disponible que dans Windows 2000 et suivants. Il faudra donc permettre au compilateur de la reconnaitre en ajoutant avant les includes:
    #define _WIN32_WINNT 0x0500
    Argh, oui, j'ai changé de machine, j'ai oublié ce détail...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
    #include<windows.h>
     
    int main (void)
    {
       char bu[256];
       FindFirstVolume (bu, sizeof bu);
       printf ("bu = '%s'\n", bu);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bu = '\\?\Volume{7079e993-8c31-11dc-84e6-806e6f6e6963}\'
     
    Process returned 0 (0x0)   execution time : 0.011 s
    Press any key to continue.

  11. #11
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Les chaines C standard étendues utilisent un tableau de wchar_t. C'est requis par les codages étendus comme Unicode, qui supportent toutes les langues écrites du monde, et même le 23 caractères du Klingon...
    etc.)
    C'est une blague ?

    [edit] apres une courte recherche je m'autoréponds :
    "oui oui c'est bien vrai, mais sous linux dans la zone privée"
    ca va aller dans Windows c'est mal ca

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Au sujet de "pourquoi une erreur d'include fait foirer l'édition de liens" : C'est une histoire de convention d'appel. gcc présuppose une fonction retournant int, avec la convention d'appel __cdecl (donc nommée "_FindFirstVolume"), alors que les fonctions Windows utilisent la convention d'appel __stdcall, le "vrai" nom de la fonction est donc "_FindFirstVolume@8" (sur un système 32 bits).

    D'où l'importance de ne pas oublier d'activer les warnings sous gcc. Si les warnings étaient activés, tu aurais eu un message "implicit declaration of FindFirstVolume".
    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. probleme sur l'api java.mail
    Par hamster. dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 16/07/2008, 09h40
  2. probleme de comprehension sur API
    Par bambi98 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 15/02/2007, 18h19
  3. Réponses: 3
    Dernier message: 07/04/2003, 20h06
  4. Probleme sur un AppendChild
    Par Toxine77 dans le forum XMLRAD
    Réponses: 3
    Dernier message: 14/03/2003, 18h25
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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