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 :

Erreur C4430 sur code Microsoft


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut Erreur C4430 sur code Microsoft
    Bonjour à tous,

    J'essaie de compiler sur un XP SP3 l'exe vshadow contenu dans le VSS SDK. J'ai installer le plateform SDK 2008, le plateform SDK 2003 pour avoir les include ATL et Visual C++.

    Je n'ai pas (encore) modifier le code source que j'ai l'erreur suivante à la compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    shadow.cpp(30) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    Voici le code incriminé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    extern "C" __cdecl wmain(int argc, WCHAR ** argv)
    {
        FunctionTracer ft(DBG_INFO);
        CommandLineParser obj;
     
        try
        {
            ft.WriteLine(
                L"\n"
                L"VSHADOW.EXE 2.2 - Volume Shadow Copy sample client\n"
                L"Copyright (C) 2005 Microsoft Corporation. All rights reserved.\n"
                L"\n"
                );
    La ligne 30 est la première accolade ouvrante, à la deuxième ligne de code.
    J'ai essayer de mettre class devant extern "C"...
    Je ne vois pas quel type je dois définir.

    D'avance merci pour toute piste

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Il manque le type de retour de wmain() :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" int __cdecl wmain(int argc, wchar_t **argv)
    Oublier le type de retour de main() est une erreur commune, et visual ne dit rien quand il s'agit de main(). Je suppose que pour wmain() il gueule quand même, et ceux qui ont traduit le code ne s'en sont mystérieusement pas rendus compte...

  3. #3
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    Merci de ta réponse. C'est une bonne piste, mais j'ai toujours du mal avec le C et le C++.
    J'ai modifier le WCHAR en wchar_t, l'éditeur l'a coloré, mais j'ai toujours la même erreur à la compilation.
    J'ai regarder sur msdn comment on doit utiliser wmain():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wmain( int argc, wchar_t *argv[ ], wchar_t *envp[ ] )
    Par déduction, *argv[] ce doit être les arguments qu'on passe à l'exécution, mais le *envp[], c'est pas pour des variables d'environnements? Il est optionnel, ou bien il le faut à tout prix dans wmain()?

    Parceque là, il n'y est pas...

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Vu que wmain() est en __cdecl, tu peux le considérer comme optionnel.
    De plus, il n'est pas standard: C'est une extension. Donc, le wmain() peut n'avoir que deux paramètres (ou aucun).

  5. #5
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Est-ce que ça pourrais venir du fait que j'ai installé deux plateform SDK différents? J'ai le 2003 et le 2008, et dans la config de VS++ express, il ne me donne que des variable d'environnement, je ne sais pas ou elle pointent

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    On s'en moque, de ça.
    As-tu rajouté le type int entre extern "C" et __cdecl ?

  7. #7
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Super Medinoc,

    Je pense que c'était ça car maintenant j'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    1>LINK : fatal error LNK1104: impossible d'ouvrir le fichier 'atlthunk.lib'
    C'est ballo, j'avais tenter de mettre int entre __cdecl et wmain.

    Ben ça n'avait pas marché

    Encore merci pour ton aide

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Cette erreur-là au moins est claire, elle signifie que tu n'as pas ATL.
    Par contre, je ne vois absolument pas pourquoi un programme de ce genre en aurait besoin...

  9. #9
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Heu, ben ça, c'est quoi?

    C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\atl

    Par contre, je n'ai pas sur mon système la librairie qu'il cherche...

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Il me semble que même avec le Platform SDK installé, tu ne peux pas utiliser ATL avec une version Express de Visual...

  11. #11
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Tu as l'air d'avoir encore raison, j'ai installé le paquet vc++ redistribuable, mais je n'ai toujours pas cette lib. Je vais essayer de la trouver sur le net....

  12. #12
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Ce coup-ci, ça y est.

    Même si je n'ai pas d'explication, je suis tombé sur un forum ou quelqu'un ne pouvait compiler firefox pour la même raison. La solution est de mettre en remarque la ligne suivante dans le fichier altbase.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //#pragma comment(lib, "atlthunk.lib")
    C'est autour de la ligne 293 je croix.

    encore merci du coup de main, ce coup-ci ça compile nickel sous XP, j'ai juste des warning au sujet de _vsnprintf

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Mais ce n'est pas la bonne question.
    La question, c'est "quel fichier inclut atlbase.h et pourquoi ?"

    En plus, si j'en crois les headers que je lis, un simple #define _ATL_NO_DEFAULT_LIBS avant inclusion suffit pour éviter ces problèmes sans modifier les headers eux-mêmes...

  14. #14
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Excuse moi, je ne comprends pas très bien.

    Il y a un include atlbase.h dans le fichier stdafx.h.

    Qu'est-ce qui vaut mieux que fasse? Que je trouve la lib manquante, ou bien que je corrige d'une autre manière? La lib ne semble pas être utilisé, je n'ai plus d'erreur de compil

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Mon conseil: Vire l'include et regarde si ça compile toujours.
    Si ça ne compile pas, décommente la ligne dans atlbase.h, rajoute un #define _ATL_NO_DEFAULT_LIBS dans stdafx.h juste avant les includes et recompile.
    Si ça ne compile toujours pas, alors il faudra se rabattre sur la modif de atlbase.h...

  16. #16
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    J'ai testé tes manip.

    Si je vire l'include atlbase.h, il râle à cause de l'utilisation d'un certain CcomPTR,
    et si je rajoute la ligne que tu ma conseillé, il cherche sa fameuse lib...

    Grumbll, ils auraient pu finir leur boulot chez Crosoft

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Tu veux dire que même avec ATL_NO_DEFAULT_LIBS, il te demande atlthunk.lib ?

    Eh bien regarde s'il n'y a pas d'autre #ifdef autour du pragma comment, car chez moi (VS 2005) je ne trouve absolument aucune trace de ce pragma dans mes headers ATL...

  18. #18
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Salut Médinoc, désolé de ne pas t'avoir répondu avant, mais je n'ai pas encore transféré le projet chez moi

    Est-ce que c'est ça que tu cherches?
    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
     
    // Thunks for __stdcall member functions
     
     
    #if defined(_M_IX86)
    #pragma pack(push,1)
    struct _stdcallthunk
    {
            DWORD   m_mov;          // mov dword ptr [esp+0x4], pThis (esp+0x4 is hWnd)
            DWORD   m_this;         //
            BYTE    m_jmp;          // jmp WndProc
            DWORD   m_relproc;      // relative jmp
            BOOL Init(DWORD_PTR proc, void* pThis)
            {
                    m_mov = 0x042444C7;  //C7 44 24 0C
                    m_this = PtrToUlong(pThis);
                    m_jmp = 0xe9;
                    m_relproc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(_stdcallthunk)));
                    // write block from data cache and
                    //  flush from instruction cache
                    FlushInstructionCache(GetCurrentProcess(), this, sizeof(_stdcallthunk));
                    return TRUE;
            }
    };
    #pragma pack(pop)
     
    PVOID __stdcall __AllocStdCallThunk(VOID);
    VOID  __stdcall __FreeStdCallThunk(PVOID);
     
    #define AllocStdCallThunk() __AllocStdCallThunk()
    #define FreeStdCallThunk(p) __FreeStdCallThunk(p)
     
    //#pragma comment(lib, "atlthunk.lib")
     
    #elif defined (_M_AMD64)

  19. #19
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    J'ai un truc équivalent dans atlstdthunk.h sous 2005 pro, mais aucune trace de #pragma comment...

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

Discussions similaires

  1. erreur 438 sur code VBA
    Par Gamack dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/08/2014, 19h58
  2. [AC-2003] Erreur Compilation sur code
    Par Aladin_23 dans le forum VBA Access
    Réponses: 3
    Dernier message: 14/10/2011, 13h25
  3. [AC-2002] Erreur 91 sur code VBA
    Par volganne dans le forum VBA Access
    Réponses: 6
    Dernier message: 02/09/2010, 14h03
  4. Erreur LNK2019 sur fonction Microsoft
    Par ThePlug dans le forum MFC
    Réponses: 4
    Dernier message: 21/08/2006, 21h57
  5. [IE]Erreur javascript sur un code de 2 lignes...
    Par narnou dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 11/05/2006, 17h20

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