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 d'application


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut Erreur d'application
    Bonjour a tous,

    J'ai developpe un programme sous Visual 2005, qui fonctionne correctement (construction et debuggage sans souci), et j'ai tenter de deployer ce programme sur autre ordinateur. L'installation se passe sans problemes, mais au lancement du programme, je recois le message suivant:

    L'application n'a pas reussi a s'initialiser correctement (0xc0000142). Cliquer sur OK pour arreter l'application.

    Bien sur je clique sur OK (unique solution), et le programme ne se lance evidemment pas.

    Etant debutant , je ne vois vraiment pas d'ou viens l'erreur.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 106
    Par défaut
    C'est certainement a cause des dependances SxS (side by side assemblies), nouveau systeme de microsoft pour gerer les differentes version des DLLs.

    Soit ton programme a un installer et tu dois installer les dependances au moment de l'install (sur un setup sous VC2005 c'est dans Project > Add > Merge module). Si ton programme n'a pas d'installer alors tu dois installer manuellement les librairies CRT sur les machines clientes, un redistribuable se trouve dans (c:/program files/microsfoft visual studio 8/sdk/v2.0/bootstrapper/packages/vcredist_x86/vcredist_x86.exe). Il y a aussi les version en 64 bits.

    Evidemment la meilleure solution est de faire un installer clean qui installe les dependances automatiquement.

    Bon courage.

  3. #3
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Merci pour ta reponse.

    En fait, j'ai suivis la premiere methode (Procédures pour déployer les DLL de bibliothèques de Visual C++ en tant qu'assemblys partagés) decrite ici :

    http://msdn.microsoft.com/fr-fr/library/ms235317.aspx

    J'ai d'abord eu quelques problemes avec des DLL qui manquaient: lors du lancement du programme un message d'erreur apparaissait, de la forme: Cette application n'a pas pu demarrer car fichier.dll est introuvable. J'ai ainsi ajouter les dll manquantes dans mon system32.

    Et depuis j'ai ce nouveau message d'erreur:

    L'application n'a pas reussi a s'initialiser correctement (0xc0000142). Cliquer sur OK pour arreter l'application.


    Voila, j'espere avoir un peu mieux completer mon probleme, pour mieux cerner le sujet ^^

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 106
    Par défaut
    Citation Envoyé par karim&thomas Voir le message
    J'ai d'abord eu quelques problemes avec des DLL qui manquaient: lors du lancement du programme un message d'erreur apparaissait, de la forme: Cette application n'a pas pu demarrer car fichier.dll est introuvable. J'ai ainsi ajouter les dll manquantes dans mon system32.

    Et depuis j'ai ce nouveau message d'erreur:

    L'application n'a pas reussi a s'initialiser correctement (0xc0000142). Cliquer sur OK pour arreter l'application.


    Voila, j'espere avoir un peu mieux completer mon probleme, pour mieux cerner le sujet ^^
    Depuis les nouveau systeme de dependances DLL de microsoft, j'ai nomme SxS tu ne peux plus copier comme ca les DLL (enfin celle de CRT) dans ton system32 et t'attendre a ce que ca marche. Elle doivent etre enregistrer (un peu comme un regsvr qui enregistre les composants COM). En fait desormais dans ton EXE tu as un manifest et c'est au moment de linker que le linker determine avec quelle version des assemblies ton application doit tourner (et ca rigole pas, il inclut le hash de la DLL dans le manifest).

    Donc grosso modo soit tu installe chez les clients le redisttribuable (manuellement ou via un installer), soit tu dis au linker d'inclure les lib directement dans ton EXE (meilleure solution si tu n'as pas de DLL).

    Bon courage.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 106

  6. #6
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Je te remercie encore, mais exuse moi, est ce que tu n'aurais pas une méthode détaillée, ou un lien expliquant comment faire ça concrètement.
    Merci

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 106
    Par défaut
    Pour linker statiquement avec les lib CRT (common run time), tu vas dans les properties de ton project > Configuration Properties > C/C++ > Code generation.

    Sur la combo Run time library tu choisis:
    - lib Multi-threaded DLL pour link dynamique (donc en utilisant les SxS du linker au moment de la compilation)
    - lib Multi-threaded pour link statique (pas de dependances sur la CRT).

    Ton exe va bien augmenter en taille evidemment si tu passe en link statique.

    Petit conseil, mefie toi du link statique si ton projet comporte plusieurs DLL qui elle aussi link avec la CRT en statique ^^

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 106
    Par défaut
    La meilleure solution a mes yeux reste de faire un setup qui installe les dependances sur les machines clients...

  9. #9
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Citation Envoyé par unmanos Voir le message
    La meilleure solution a mes yeux reste de faire un setup qui installe les dependances sur les machines clients...
    Est ce la methode que j'ai suivie ici: http://msdn.microsoft.com/fr-fr/library/ms235317.aspx
    ou une nouvelle?
    Si c'est une nouvelle, comment proceder ?

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 106
    Par défaut
    Tu n'as qu'a linker en statique et tu n'auras plus de dependances sur les DLL SxS de la CRT:

    Tu vas dans les properties de ton project > Configuration Properties > C/C++ > Code generation.

    Sur la combo Run time library tu choisis:
    - Multi-threaded au liey de Multi-threaded DLL

    Ton exe va augmenter en taille mais rien de dramatique.

  11. #11
    Membre Expert

    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
    Par défaut
    Salut,

    Citation Envoyé par unmanos Voir le message
    Depuis les nouveau systeme de dependances DLL de microsoft, j'ai nomme SxS tu ne peux plus copier comme ca les DLL (enfin celle de CRT) dans ton system32 et t'attendre a ce que ca marche. Elle doivent etre enregistrer (un peu comme un regsvr qui enregistre les composants COM).
    Ce n'est pas obligé, il est toujours possible de copier les DLL (mais pas dans system32, qui faisait ça "avant" d'ailleurs ?!), c'est ce qui s'appelle library DLLs as private assemblies. Les différentes possibilités de structures sont décrites dans assembly searching sequence.
    Par contre ça veut dire qu'il ne faut pas mélanger plusieurs versions des CRT sur un exécutable (et les DLL qui l'accompagnent), ça a l'air évident comme ça mais ça arrive beaucoup plus vite qu'on ne croit (les CRT différent entre vc80 RTM et vc80 SP1 notamment).

    Donc au final pour moi le plus simple reste le 'private side-by-side assemblies'.

    Pour vérifier la version des CRT utilisée en général je fais un truc genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -s -H -o -a -E ' name="Microsoft.VC80.CRT" version="([^"]*")' *.exe *.dll
    Si ça sort plusieurs versions, c'est moche !

    MAT.

  12. #12
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Salut, et merci pour vos reponses,

    Je viens d'essayer la methode de linker en statique, j'obtiens alors une erreur sur le programme:

    1>C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\afxver_.h(77) : fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds

    1>BSCMAKE: error BK1506 : cannot open file '.\Debug\stdafx.sbr': No such file or directory


    erreur qui pointe sur le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #if defined(_AFXDLL) && !defined(_DLL)
    	#error Please use the /MD switch for _AFXDLL builds
    #endif
     
    #if defined(_AFXDLL) && !defined(_MT)
    	#error Please use the /MD switch (multithreaded DLL C-runtime)
    #endif

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 106
    Par défaut
    #error : Please use the /MD switch for _AFXDLL builds
    _AFXDLL: veut dire que tu utilise les MFC en DLL (use MFC in a shared library).
    /MD : Option du linker (Multi-threaded DLL lib CRT).

    Donc grosso modo, l'erreur en francais ca donne: "Si tu veux utiliser les MFC en DLL, tu dois utiliser les lib CRT en DLL:.

    Si tu fais un link statique avec la lib avec les lib CRT, tu dois aussi faire un link statique avec les lib MFC.

    Donc si tu as "Multi-threaded" dans la code generation tu dois avoir "Use MFC in a static library".

    Tu peux aussi fouiller un peu sur goole, ca ne fait pas de mal:
    http://www.google.com/search?hl=en&q...XDLL+builds%22

Discussions similaires

  1. [PHPExcel] Erreur d'application
    Par unmulot dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 29/06/2006, 09h15
  2. erreur d'application aléatoire
    Par Galkir dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/06/2006, 15h03
  3. [FB] Gestion des erreurs et application francophone
    Par Benjamin GAGNEUX dans le forum Installation
    Réponses: 10
    Dernier message: 20/05/2006, 14h54
  4. Erreur d'application
    Par the watcher dans le forum Bases de données
    Réponses: 13
    Dernier message: 11/05/2006, 12h29
  5. msimn.exe Erreur d'application
    Par popy29 dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 31/12/2005, 12h26

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