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 :

Problème bien coriace autour des fichiers manifests que je n'arrive pas à résoudre ..


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut Problème bien coriace autour des fichiers manifests que je n'arrive pas à résoudre ..
    Bonsoir tout le monde,


    J'ai un problème dont je n'ai pas trouvé de solutions ...


    J'ai fait un programme, il marche très bien, et aujourd'hui je l'ai envoyé à quelqu'un. Ce quelqu'un me répond "Il ne marche pas ton programme", je lui demande "Qu’est-ce qu'il t'affiche ?" et il me répond "Rien, ça fait juste le son 'toung' d'erreur de Windows". Je trouve ça bizarre, j'essai donc mon programme sur plusieurs PC chez moi, et résultat des courses, il marche bien sur deux PC et ne marche pas sur deux autres PC. Je ne vois pas ce qu’ils peuvent avoir en commun.

    Donc, je pars sur un PC sur lequel le problème est reproductible, j'y mets un EDI, et je trouve que sans le fichier manifest, mon programme marche bien.
    Ensuite, je me dis qu'il y a quelque chose dans mon code qui rentre en conflit avec le manifest, donc j'essai d'enlever bout par bout tout le contenu de mon programme. C'est passé par un stade où à la place de faire un son sans rien afficher, ça affichait juste une fenêtre avec sa couleur de fond, mais pas tout ce qu'il devait y avoir dedans (boutons, editboxs, ...). A la fin, j'ai tout enlevé sauf un bouton, et le problème persistait ...

    J'ai donc commencé à douté de mon code et du fichier manifest, donc pour écarter ses hypothèses, j'ai pris un petit programme qui marchais bien sur ce PC, j'en aie extrait le fichier manifest, et j'ai vérifié sur internet, c'est bien la même chose que ce que l'on donne dans les tutos ou sur le site de Microsoft.
    Donc avec ça, le problème ne peut plus venir du fichier manifest en lui-même.
    Ensuite, j'ai fait un nouveau projet de programme en fenêtre avec mon EDI, CodeBlocks, et donc il y a déjà dedans un bout de code pour pouvoir afficher une fenêtre, j'y ais juste ajouté un simple bouton et je l'ai compilé, il m'affiche une fenêtre avec un bouton, jusque là normale, et j'essai avec le manifeste en le mettant dans le répertoire de l'exe avec le même nom que l'exe+.manifest, comme ça, ça exclut aussi un problème de ressources.

    Et donc avec ce teste, même symptômes qu'avec mon programme, pas de manifeste, le bouton s'affiche, avec le manifeste, la fenêtre s'affiche vide.

    Donc, pour résumer :
    - le manifeste est bon, c'est sûr, je l'ai testé avec un autre programme est il marche sans le faire planter,
    - je ne pense pas qu'il y ait de problème dans le code donné par l'IDE CodeBlocks,
    - je ne pense pas que ça vienne des PCs, parce que le problème a put être reproduit sur trois PCs, et que sur ces PC là, les autres programmes qui contiennent des manifestes marchent très bien.

    J'ai pensé sans trop y croire que ça pouvais venir du compilateur, puisque j'utilisais une version de MinGW "Candidate", en mettant une autre version, ça n'a rien changé.

    Finalement, j'ai regardé ce que renvoyais GetLastError(), et la j'ai eut un truc auquel je ne m'attendais pas du tout :
    - GetLastError renvois 2 juste au début de la fonction d'entrée WinMain, soit "The system cannot find the file specified." (pas bien compris pourquoi)
    - GetLastError renvois 1400 juste après l'appel à CreateWindow pour la création de la fenêtre, soit "Invalid window handle."


    Donc, là je suis complètement dépassé ...

    Qu'en pensez-vous ?
    Quels outils me permettraient de diagnostiquer le problème plus finement ?

    Je vous mets ci-dessous le code de teste ainsi que le contenu du fichier manifeste.

    Merci de vous être penché sur mon problème.

    A+, Pierre.



    Le code donné par l'EDI CodeBlocks avec l'ajout d'un bouton et de ce qu'il faut pour voir quelle erreur est renvoyé :
    PS : Sachant que sans le manifest, ce bout de code marche très bien.

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    #include <windows.h>
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "CodeBlocksWindowsApp";
    
    HINSTANCE instance;
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nCmdShow)
    {
        if (GetLastError())
        {
            // => renvoit 2 si manifest
            exit(GetLastError());
        }
        else
        {
            MessageBox(NULL, "OK", "Info", MB_OK);
        }
    
    
        instance=hThisInstance;
    
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default colour as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Code::Blocks Template Windows App",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    		   
        if (GetLastError())
        {
            // => renvoit 1400 si manifest
            exit(GetLastError());
        }
        else
        {
            MessageBox(NULL, "OK", "Info", MB_OK);
        }
    	
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nCmdShow);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
                        CreateWindow("BUTTON",
                             "Bouton ...",
                             WS_CHILD | WS_VISIBLE,
                             145, 159,
                             149, 22,
                             hwnd,
                             100,
                             instance,
                             NULL);
                return 0;
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    Le contenu du fichier manifest qui marche puisque sur d'autres programmes, il ne les fait pas planter :

    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
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        version="1.0.0.2"
        processorArchitecture="x86"
        name="Carlos Domingo Mas.Choli.msg6_id"
        type="win32"
    />
    <description>MSN Messenger id number</description>
    <dependency>
        <dependentAssembly>
           <assemblyIdentity
              type="win32"
              name="Microsoft.Windows.Common-Controls"
              version="6.0.0.0"
              processorArchitecture="X86"
              publicKeyToken="6595b64144ccf1df"
              language="*"
           />
        </dependentAssembly>
    </dependency>
    </assembly>

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    Je suis vert, toujours sur un PC sur lequel il y avait le problème, je viens d'installer les "Debugging Tools for Windows" pour essayer de diagnostiquer le problème plus en profondeur, et rien que le faite d'installer ce truc fait que le programme ne plante plus ... ça me fait ch***.
    Et bien sur, en désinstallant ce truc le problème ne reviens pas ... (oui oui, je le voulais mon problème, j'y tiens ... )

    Ca commence à me faire ...

    Je vais installer l'IDE de crosoft voir si ça marche avec leur compilo ...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    Ça ne marche pas non plus avec le compilo de crosoft ... je ne comprend plus ...

  4. #4
    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
    Pour le compilo de Microsoft comment fais-tu exactement ?
    Tu utilises là aussi le manifest en ressources ?
    Ou bien tu insères ton manifest avec les options du projet ?
    Ou encore tu utilises la méthode recommandée par MS pour lier un programme C++ natif aux Common Controls V6, le #pragma comment(linker, "/MANIFESTDEPENDENCY: etc."), ou bien encore une autre méthode ?

    PS:
    • Tu personalises le manifest, au moins ? (ne serait-ce qu'en modifiant le nom "Carlos Domingo Mas.Choli.msg6_id")
    • Et aussi, je ne sais pas si CommonControlsV6 marche très bien en Multi-Byte, tu as essayé en Unicode ?
    • Tu as essayé de mettre NULL en guise de HINSTANCE pour le bouton ?
    • GetLastError() est rarement fiable quand la dernière fonction n'a pas fait d'erreur. Tu dois contrôler la valeur retournée avant de contrôler GetLastError(). SetLastError(ERROR_SUCCESS) peut aussi être utile...


    PPS: Le printf-debugging, tu as essayé ? Tu devrais écrire dans un fichier texte tous les résultats des fonctions de création, pour voir où un truc plante. C'est facilement plus fiable qu'une MessageBox()...
    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.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    Salut Médinoc, et merci pour ta réponse.

    Pour mon test avec VC++, je mettais le .manifest à coté du .exe

    Sinon, si t'a leur IDE sous la main, où est-ce qu'on lui insère le manifest dans les options ?

    Pour la personalisation du manifest, oui, je l'avais fait, mais comme j'avais tout remis en question (on ne sait jamais, un caractère qui ne lui plait pas ...), j'avais pris le manifest d'un programme qui marchait, d'où effectivement le nom qui n'est pas le mien.

    Et aussi, je ne sais pas si CommonControlsV6 marche très bien en Multi-Byte, tu as essayé en Unicode ?
    => Tu veut dire d'appeler les "common controls" avec une fonction de l'API Windows ?
    Si oui, j'ai essayé InitCommonControls(), mais ça n'avait pas marché.

    "Tu as essayé de mettre NULL en guise de HINSTANCE pour le bouton ?"
    => Non, je n'y avais pas pensé parce qu'apparament l'erreur étais avant, mais t'a raison, faudra que j'essai.

    "GetLastError() est rarement fiable quand la dernière fonction n'a pas fait d'erreur. Tu dois contrôler la valeur retournée avant de contrôler GetLastError(). SetLastError(ERROR_SUCCESS) peut aussi être utile..."
    => Ok, c'est sur que c'est plus "rigide" comme programme, mais dans mes testes je pense qu'on ne pouvais pas faire plus claire, sans manifest, GetLastError renvoyais 0, avec manifest, elle renvoyait 2 ou 1400 en fonction de la position.

    "Le printf-debugging, tu as essayé ?" => tu veut dire fprintf(stderr, [...]) ?
    Parce que pour mes tests, je regardais ce que renvoyait le programme avec exit(GetLastError());.

    Donc, pour l'instant, je n'ai plus trop de quoi bosser, parce que sur le premier PC sur lequel le problème étais reproductible, il ne l'est plus depuis que j'ai installé le débugger de Microsoft, et le deuxième est un portable, et mon frère est partis avec et reviens dans quelque jours.

    D'ici là, je pense que je vais essayer d'inclure avec la méthode conseillé par crosoft, faut que je recherche sur leur doc, et après je l'enverrais le résultat par msn à la première personne qui m'avais trouvé ce bug.

    Par contre, comment faire pour savoir quelle est la valeur renvoyé par un programme, parce que pour l'instant je fesait ça avec l'IDE, mais ça serait bien que je puisse savoir comment faire sans, pour que je puisse envoyer divers version de tests aux personnes chez qui ça bug et qu'elle puisse me dire quel numéro d'erreur est renvoyé.
    Est-ce que les valeurs différentes de zéros sont enregistrées dans un journal par Windows ? sinon, existe-il un petit utilitaire légé qui puisse faire ça ?

    En tout cas, merci bien Médinoc pour t'être penché sur mon problème.

    A la prochaine.

    Pierre.

  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
    Je n'ai ni le temps ni l'énergie (00h36) de répondre à toutes tes questions, mais les Common Controls V6, c'est ce que tu cherches à avoir.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              name="Microsoft.Windows.Common-Controls"
              version="6.0.0.0"
    En clair, les styles XP.
    Normalement, le manifeste sert à indiquer à Windows qu'il faut utiliser la version 6 de ComCtl32.dll. Pour la petite histoire, cette DLL contient elle-même un manifest qui dit "c'est moi qui m'appelle Microsoft.Windows.Common-Controls version 6.0.0.0"

    Pour l'inclusion dans Visual, j'utilise un fichier neutre comme ça:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <dependency>
        <dependentAssembly>
          <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="x86"
                publicKeyToken="6595b64144ccf1df"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly>
    Ensuite, dans Visual Studio 2005:
    "Project Properties" -> "Configuration Properties" -> "Manifest Tool" -> "Input and Output" -> "Additional Manifest Files" : (chemin du manifest "neutre" à inclure)
    Mais c'est déprécié par rapport au #pragma comment(linker, blabla).

    le printf-debugging désigne bien ça, mais je conseille d'écrire dans un fichier texte puisque de base, une application Windows n'a pas de console. C'est plus fiable que exit(GetLastError()), et tu peux y mettre plus d'infos.
    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.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    Ok, merci.

    Je suis en train de voir ce que ça donne avec du printf-debuging, je te tiens au courant.

    A+, Pierre.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    C'est bon, finalement mon problème est résolu (voir ici)

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

Discussions similaires

  1. [Spip] simple problème de require que je n'arrive pas à résoudre
    Par beegees dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 04/12/2013, 10h01
  2. Message d'erreur que je n'arrive pas à résoudre
    Par MAMIKA dans le forum MATLAB
    Réponses: 5
    Dernier message: 15/09/2008, 13h17
  3. Petit bug IE // FF que je n'arrive pas à résoudre
    Par Denti-fritz dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 04/05/2008, 23h34
  4. Réponses: 4
    Dernier message: 14/09/2007, 17h14
  5. problème que je n'arrive pas à résoudre de façon récursive
    Par miam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 31/07/2004, 11h21

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