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 :

Fonctionne sous XP, pas sous Vista.


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 19
    Points
    19
    Par défaut Fonctionne sous XP, pas sous Vista.
    Bonjour,


    Je suis auteur d'un logiciel pour l'industrie du jeu vidéo et du cinéma d'animation. Cela fait maintenant deux semaines que je suis passé à VC8 pour la compilation et le déployement de mon application.

    Notez que cette application est basée sur la library wxWidgets. Notez aussi que les exemples de code de cette library (version 2.8.4) ont été compilés et executés avec succés aussi bien sur Vista que sur XP.

    Mon problème est le suivant : Je constate depuis le changement de vc7 à vc8 une imcompatibilité visible au lancement de l'application sous vista (je n'ai aucun problème sous XP, l'application fonctionne comme avant). Je précise qu'avec vc7 , je n'avais pas de problèmes avec vista.

    Le message d'erreur sous vista en mode RELEASE est le suivant : "unfold3dstudio.exe à cesser de fonctionner ... windows receuille etc...". Ensuite j'obtient un message de la Runtime Library : " L'application n'a pas réussi à s"initialiser correctement (0x80000003). "

    Le message d'erreur sous vista en mode DEBUG est le suivant :

    "Windows has triggered a breakpoint in unfold3dstudio.exe

    this may be due to a corruption of the heap, and indicates a bug in unfold3dstudio.exe or any of the DLLs it has loaded.

    The output window may have more diagnostic information"


    Voici une copie de la pile d'appel :
    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
      ntdll.dll!77722ea8()  
      [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
    > msvcr80d.dll!__CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=1, void * lpreserved=0x0116fd24)  Line 355 C
      msvcr80d.dll!_CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=1, void * lpreserved=0x0116fd24)  Line 214 + 0x11 bytes C
      ntdll.dll!7774a604()  
      ntdll.dll!7770c8f9()  
      ntdll.dll!7770ccf7()  
      ntdll.dll!7770e4f8()  
      ntdll.dll!7773fea0()  
      ntdll.dll!77707c46()  
      ntdll.dll!7770c8cb()  
      ntdll.dll!777700aa()  
      ntdll.dll!77714c41()  
      ntdll.dll!77715ad7()  
      ntdll.dll!77716862()  
      ntdll.dll!7771a980()
    Voici une copie d'une partie de code pointee par visual lors de la session de debogage :
    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
    #if defined (_CRT_CHECK_MANIFEST)
    
    if (!_check_manifest(hDllHandle))
    
    {
    
    __try
    
    {
    
    _NMSG_WRITE(_RT_CHECKMANIFEST);
    
    }
    
    __except( EXCEPTION_EXECUTE_HANDLER )
    
    {
    
    OutputDebugString(_GET_RTERRMSG(_RT_CHECKMANIFEST));
    
    DebugBreak();
    
    }                                                                 <===== Arret ici
    
    _ioterm(); /* shut down lowio */
    
    _mtterm(); /* free TLS index, call _mtdeletelocks() */
    
    _heap_term(); /* heap is now invalid! */
    
    return FALSE;
    
    }
    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
    Voici mes flags de Compil (en mode debug) :
    cl /nologo -c   /Od /Z7 /EHsc /MDd /RTC1 /D WIN32 /D _WINDOWS /D _CRT_SE
    CURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_DEPRECATE    /D
     WINDOWS  /D "BUILD_MULTIUVSET"  /D "BUILD_NOSECURE"  -I./src -I..\DevelLib503\/
    src/ /I../DevelExternal/superlu_3.0/SRC/ /I../DevelExternal/Glut/  /D "__WXMSW__
    " /D "_WINDOWS" /D "NOPCH" /D "_VC80_UPGRADE=0x0600"  -I../DevelExternal/wxWidge
    ts-2.8.4//lib/vc_lib/mswd -I../DevelExternal/wxWidgets-2.8.4//include  -I../Deve
    lExternal/wxWidgets-2.8.4//src/regex -I../DevelExternal/wxWidgets-2.8.4//src/reg
    ex -I../DevelExternal/wxWidgets-2.8.4//src/png -I../DevelExternal/wxWidgets-2.8.
    4//src/zlib -I../DevelExternal/wxWidgets-2.8.4//src/jpeg -I../DevelExternal/wxWi
    dgets-2.8.4//src/jpeg -I../DevelExternal/wxWidgets-2.8.4//src/tiff  -D "BUILD_NO
    SECURE" -D "BUILD_SURFOPTIM"   -D "BUILD_PACKING"  -D "BUILD_OPTIMPACKINGTOOLS"
    -D "BUILD_MULTIUVSET"  -D "BUILD_IMPORTUV" -D "BUILD_CUTTINGTOOLS"   -D "BUILD_N
    OSAVINGFUNCS" -DPROGRAMNAME=\""Unfold3D Studio Edition DEMO "\" -DPROGRAMVERSION
    =\""5.0.3"\"  src/cunfoldthread.cpp /Foobj/cunfoldthread.obj
    Voici mes flags de Link (mode debug aussi) :
    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
    link /nologo  /STACK:10000000  /DEBUG /SUBSYSTEM:WINDOWS /MACHINE:X86 /I
    NCREMENTAL:NO OpenGL32.lib Iphlpapi.lib /NODEFAULTLIB:LIBC /NODEFAULTLIB:LIBCMT
    /NODEFAULTLIB:ADVAPI32.dll /NODEFAULTLIB:WSOCK32.dll glu32.lib  kernel32.lib use
    r32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib oldnames.lib c
    omctl32.lib odbc32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib w
    sock32.lib ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib/wxbase28d.lib ../DevelEx
    ternal/wxWidgets-2.8.4//lib/vc_lib/wxregexd.lib ../DevelExternal/wxWidgets-2.8.4
    //lib/vc_lib/wxpngd.lib ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib/wxzlibd.lib
     ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib/wxjpegd.lib ../DevelExternal/wxWid
    gets-2.8.4//lib/vc_lib/wxtiffd.lib  ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib
    /wxmsw28d_core.lib ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib/wxmsw28d_adv.lib
     ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib/wxexpatd.lib ../DevelExternal/wxWi
    dgets-2.8.4//lib/vc_lib/wxmsw28d_gl.lib  ../DevelExternal/wxWidgets-2.8.4//lib/v
    c_lib/wxmsw28d_richtext.lib netapi32.lib wsock32.lib ..\DevelLib503\/keylok/kfun
    c32.lib obj/cappframe.obj obj/cappwx.obj obj/cbitmap.obj obj/cglcanvas3d.obj obj
    /cgllisthandler.obj obj/ckeymousemap.obj obj/cmessage.obj obj/coperation.obj obj
    /cpackingprefwindow.obj obj/cunfold3dprefwindow.obj obj/cunfoldthread.obj obj/sh
    owbigtext.obj obj/trackball.obj src/unfold3d.res ..\DevelLib503\/bin/libunfold3d
    .lib  ../DevelExternal/Glut/GLUT32.LIB  /OUT:bin/unfold3dstudio.exe
    Notez aussi que j'ai réduit le code d'initialisation de la wxWidget au minimum vital :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // fichier main.cpp
    
    IMPLEMENT_APP(MyApp)
    
    bool MyApp::OnInit()
    {
      // l'excution n'atteint pas cette ligne.
    
     return true;
    }
    Comme vous le voyez, il n'y a pas de code à remettre en question puisqu'il n'y a pas de code provenant de ma part, et je ne pense pas que le problème vienne du code d'initialisation de la library wxWidget. Il s'agit donc surrement d'un problème de chargement DLL, d'un problème de fichier manifest, ou d'un problème de flag de compil / link. Il s'agit surrement d'une chose toute bête, mais je ne vois pas. Avez-vous une idée, une méthodologie de résolution à me proposer, ou un conseil ?



    Merci par avance,


    Rémi Arquier
    Développement Unfold3D
    http://www.unfold3d.com

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Juste pour être sûr, tu es au courant que depuis vc80 il n'est plus possible de copier "à la main" les dll "système" (msvcrt80.dll par ex) pour les livrer avec une application et qu'il faut passer par "vcredist_x86.exe" ?
    La machine cible a la même version de vc80 d'installée ?

    Peut-être que le problème n'est pas spécialement lié à vista en fait.
    Enfin j'en sais rien vu que j'essaye de me tenir le plus éloigné possible de vista pour le moment

    MAT.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Non je n'étais pas au courant ! Merci pour le renseignement ! Tu ne peux pas t'imaginer le nombre de truc que j'ai testé... Je n'en peu plus !

    Je vais donc m'interresser à ce vcredist_x86.exe tout de suite.

    Mais juste une question, sur la machine de développement, dois-je aussi utiliser ce vcredist ? Car là effectivement, j'ai copié à la main les msvcrX.dll dans le répertoire d'execution. Car si j'enlève ces fichiers du répertoire, et que je lance mon appli, vista me les réclame !

    Mille fois merci.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Quand tu installes msvc il installe aussi les dll nécessaires.
    Par contre ce n'est pas le cas quand on déploie ses applications ailleurs, typiquement sur une machine qui n'a pas msvc d'installé, au hasard chez un client tant qu'à faire
    En théorie, en rajoutant un fichier manifest adéquat qui indique que les dll sont à côté de l'exe (ce qui est appelé 'deploying private assemblies' dans msdn) , on est supposé pouvoir copier les dll "à l'ancienne".
    En pratique j'ai jamais réussi à le faire fonctionner correctement et je me suis rabattu sur l'exécution sournoise de 'vcredist' à la fin de l'installation des applications.

    Quelques débuts de liens explicatifs :
    * http://msdn2.microsoft.com/en-us/lib...42(VS.80).aspx
    * http://www.microsoft.com/downloads/d...displaylang=en

    En cherchant 'vcredist' dans les forums tu devrais aussi trouver des trucs.

    Attention aussi que la version des dll (et de vcredist aussi) n'est pas la même pour vc80 et vc80 SP1, donc il faut bien prendre ce qui correspond à ta version de msvc.
    Et ça veut aussi dire que si toi tu as le SP1 mais que ton collègue du bureau à côté ne l'a pas, si tu fabriques une application qui utilise une bibliothèque compilée par lui (donc sans le SP1), l'application va mélanger plusieurs versions des CRT, fonctionner chez toi, mais pas chez lui
    Dans le doute il y a toujours moyen de bourriner en forçant une installation des deux versions des 'vcredist', mais en fait en théorie celui du SP1 est supposé compatible binairement avec celui du RTM et donc devrait suffire...
    En général j'essaye de maîtriser les dépendances pour ne pas mélanger différentes versions des CRT (on peut ouvrir un exe ou une dll avec msvc directement pour regarder le manifest intégré et voir le(s) numéro(s) de version(s) des CRT dont il dépend).

    Bref, je ne sais pas si ça aide, c'est peut-être même pas ça ton problème...
    Bon courage en tous cas !
    (et merci Microsoft sur ce coup-là...)

    MAT.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Si ça m'aide ce que tu dis ? Plutôt oui... Ca y est ça marche !

    Après avoir lancé le vcredist et effacé mes CRT dll de mon répertoire d'exécution, vista me réclamait encore les CRT dll... Là je me suis énervé, et j'ai inclu le manifest directement dans l'exécutable (avec mt). Et ça a marché nickel.

    Le truc qui me rend fou, c'est que je croyais avoir lu que le comportement exe+manifest externe était égal à celui exe+manifest intégré M'enfin bon j'ai peut-être mal lu. En tout cas je te remercie beacoup ! Tu m'as donné de très précieuses informations.

    Je vais donc faire comme toi : inclure vcredist dans mon script de déploiement. De plus en compilant les informations que tu m'as donné sur les version des CRT et des DLL, on peut sortir la règle suivante (dis moi si elle est fausse ) :

    A partir du moment ou la machine exécutante possède les CRT en version SP1, une application, compilé avec les SP1 ou sans les SP1 ou avec un mixage des deux fonctionnera. C'est bien ça ?

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par remi.a
    Le truc qui me rend fou, c'est que je croyais avoir lu que le comportement exe+manifest externe était égal à celui exe+manifest intégré M'enfin bon j'ai peut-être mal lu.
    Effectivement je suis tombé sur le même problème (et je connais 2 ou 3 autres personnes qui se sont aussi bien acharné dessus), et c'est ce qui me faisait dire que je n'avais jamais vraiment réussi à faire fonctionner le 'private assemblies deployment' correctement...

    Citation Envoyé par remi.a
    A partir du moment ou la machine exécutante possède les CRT en version SP1, une application, compilé avec les SP1 ou sans les SP1 ou avec un mixage des deux fonctionnera. C'est bien ça ?
    Je dirais bien oui, mais là d'un coup j'ai comme un doute, et vu le sac de noeud qu'est cette histoire je pense qu'il faudrait tester avec une machine vierge pour en être vraiment sûr.

    MAT.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Merci encore Mat.

    Après coup, il me vient la reflexion suivante : Je trouve cela bizzare qu'une application plante pour un problème de DLL mal trouvée ou mal installé.

    Bref, J'arrete de raler.


    Rémi

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par remi.a
    Je trouve cela bizzare qu'une application plante pour un problème de DLL mal trouvée ou mal installé.
    C'est clair, c'est aberrant, j'abonde totalement !

    MAT.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ben, c'est le cas aussi sous nux.

    D'ailleurs, ces applications ne "plantent" généralement pas (même si ça peut arriver) : La plupart du temps, elles ne démarrent pas du tout, ce qui n'est pas la même chose.

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

Discussions similaires

  1. Vérification formulaire. Fonctionne sous FF, pas sous IE.
    Par Invité dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/10/2009, 13h14
  2. [AJAX] [Xajax] Code Xajax fonctionne sous FF, pas sous IE
    Par lemondaf dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/07/2007, 22h10
  3. Réponses: 11
    Dernier message: 11/05/2006, 09h05
  4. script fonctionnant sous IE pas sous FF
    Par thibotus01 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/03/2006, 18h07

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