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 :

Impossible de lancer le programme : ftd2xx.dll manquante


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut Impossible de lancer le programme : ftd2xx.dll manquante
    Bonjour à tous,

    Je développe actuellement un logiciel sous VS2019. Dans une partie du code (communication avec un périphérique usb) j'inclus le .h suivant : "ftd2xx.h", j'ai bien fait l'éditions des liens dans le paramètrage de VS.
    Le logiciel ne se lance pas à cause de l'erreur suivante "ftd2xx.dll manquante".
    J'ai récupéré l'installer du driver sur le site de FTDI. Dans la doc de l'installer, il est écrit que le driver sera fini d'être installé quand j'aurais connecté le périphérique en question.
    Actuellement, je n'ai pas le périphérique sous la main pour finir l'installation.
    Mes questions :
    Si l'installation n'est pas finie, c'est normal que le fichier ftd2xx.dll soit introuvable?
    Sachant que ftd2xx.dll est bel et bien présent dans le répertoire CDM v2.12.28 WHQL Certified\amd64 et que je cible bien vers ce dossier.

    Si oui, est-ce que je peux coller ftd2xx.dll dans Windows/System32?
    EDIT : Non ça ne fonctionne pas, c'est pire ^^'

    D'avance, merci.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Généralement, quand la compilation et l'édition de liens s'effectuent sans problème et que ton programme ne veut malgré tout pas se lancer sous prétexte d'une dll manquante, c'est "simplement" parce que la dll en question ne se trouve ni dans un dossier dans lequel le système d'exploitation sait devoir aller chercher après les dll (en gros : tous les dossier repris par la variable PATH ), ni dans le dossier dans lequel se trouve l'exécutable lui-même (ou est-ce le dossier à partir duquel l'exécutable est lancé j'ai toujours un doute sur ce point )

    La solution la plus simple est de localiser l'endroit ou cette dll existe et de la copier "tout bêtement" dans le dossier qui contient ton exécutable, en faisant juste attention à choisir la bonne "cible" pour la dll (debug ou release), si les deux existent
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut
    Bonjour,
    Alors, j'ai copié la dll dans le dossier qui va bien et.... plus de problème de DLL mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L'application n'a pas réussi à démarrer correctement (0xc000007b)
    C'est embêtant...

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Ca, c'est parce qu'il existe une très grosse différence entre un "code valide" (accepté par le compilateur) et un "code correct" (comprend : qui fourni, sur base d'une situation donnée, le résultat attendu, prévisible et reproductible)

    Si, pour une raison ou une autre, ton application "plante" alors qu'elle est à peine occupée à démarrer, c'est sans doute que ton code est "valide" (accepté par le compilateur) mais ... incorrect.

    Sans rien savoir de ton projet, et surtout sans disposer du code, il est particulièrement difficile de t'aider! On peut cependant raisonnablement partir du principe que tu as sans doute foutu un sérieux bordel au niveau de l'utilisation des pointeurs
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut
    Mon programme compile et fonctionne "correctement" en version debug.
    Dès que j'inclus la DLL et que j'utilise les fonctions de la lib ftdi, j'ai ce message...
    Voilà le code en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FT_STATUS ftStatus = 0;
    ftStatus = FT_OpenEx(m_SerialNumberX, FT_OPEN_BY_SERIAL_NUMBER, &m_ftHandle);
    Dès que je commente ce code, le programme se lance et fonctionne.

    EDIT:
    En gros, je développe une interface graphique qui me permet de communiquer avec des périphériques externes.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Mon programme compile "correctement"
    C'est donc un code "valide" (accepté par le compilateur) mais "incorrect" (qui ne suit pas tout à fait la logique imposée par l'utilisation de la bibliothèque externe
    Mon programme fonctionne "correctement" en version debug.
    Dès que j'inclus la DLL et que j'utilise les fonctions de la lib ftdi, j'ai ce message...
    Voilà le code en question :
    Le code ne fonctionne donc pas "correctement" en mode débug

    Au mieux, on peut faire valoir que "la partie du code qui ne dépend pas de la bibliothèque externe semble fonctionner", mais cela reste encore à prouver

    Et, donc c'est qu'il y a un problème lorsque tu essaye de faire appel à la fonction FT_OpenEx.

    Si l'on en crois le nom de cette fonction ainsi que les valeurs associées aux différents paramètres que tu lui transmet, il semblerait que cette fonction ait pour but d'assurer la connexion du périphérique branché sur le port USB afin de pouvoir mettre en place le protocole de communication.

    La première chose étant donc de tester la valeur de retour de cette fonction en s'assurant qu'elle ne correspond pas à un code d'erreur, avec un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* pas besoin d'initialiser ftStatus à 0 si c'est pour en changer tout de suite la valeur ;) */
    FT_STATUS ftStatus =  FT_OpenEx(m_SerialNumberX, FT_OPEN_BY_SERIAL_NUMBER, &m_ftHandle);
    if(ftStatus != 0 ) { // je pars du principe que cette fonction renvoie 0 si tout s'est bien déroulé... à adapter
        /*il y a eu un problème, ftStatus devrais te permettre de récupérer une chaine de caractères plus "compréhensible
         * à propos du problème
         */
       char * error = /* la fonction qui permet de récupérer la chaine de caractères */;
       throw std::runtime_error(error);
    }
    /* si on arrive ici, la connexion s'est établie correctement, on peut donc passer
     * à la suite
     */
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Et, donc c'est qu'il y a un problème lorsque tu essaye de faire appel à la fonction FT_OpenEx.
    ça je m'en doutais un peu

    Citation Envoyé par koala01 Voir le message
    La première chose étant donc de tester la valeur de retour de cette fonction en s'assurant qu'elle ne correspond pas à un code d'erreur, avec un code proche de[CODE]/* pas besoin d'initialiser ftStatus à 0 si c'est pour en changer tout de suite la valeur */
    J'avais déjà pensé à ça. Bon, ok, j'ai écrit ça comme code à la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FT_STATUS ftStatus = 0;
    ftStatus = FT_OpenEx(m_SerialNumberX, FT_OPEN_BY_SERIAL_NUMBER, &m_ftHandle);
    	if (ftStatus != FT_OK) 
    	{
    		int i = 0;
    		// error
    	}
    Sauf que je n'ai pas l'opportunité de vérifier ce que cette fonction renvoie puisque le programme ne se lance pas.
    De plus, je ne fais actuellement pas appel à la méthode qui fait appel à FT_OpenEx.

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Citation Envoyé par Ioro1 Voir le message
    ça je m'en doutais un peu



    J'avais déjà pensé à ça. Bon, ok, j'ai écrit ça comme code à la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FT_STATUS ftStatus = 0;
    ftStatus = FT_OpenEx(m_SerialNumberX, FT_OPEN_BY_SERIAL_NUMBER, &m_ftHandle);
    	if (ftStatus != FT_OK) 
    	{
    		int i = 0;
    		// error
    	}
    Sauf que je n'ai pas l'opportunité de vérifier ce que cette fonction renvoie puisque le programme ne se lance pas.
    De plus, je ne fais actuellement pas appel à la méthode qui fait appel à FT_OpenEx.
    Justement, tu ne dois permettre d'aller au dela de ce qui est la ligne 8 dans le code que tu montre que si la valeur de ftStatus correspond à la valeur qui signifie "tout s'est bien passé.

    Par exemple, remplaçant le commentaire // error par le lancement d'une exception qui pourrait au moins indiquer la valeur de ftStatus, mais, idéalement, en ayant pris la précaution de convertir cette valeur dans la chaine de caractères correspondante.

    Mais, ceci dit, il faudrait apprendre à lire la documentation, car, après avoir écrit cette partie de mon intervention, j'ai quand même essayer de avoir un peu d'information sur la bibliothèque ftd2xx, et il m'a fallu 30 seconde, un fois que j'ai trouvé le pdf reprenant la doc, pour trouver le lien vers la page 76 dans la table des matière, qui permet de voir les types de données utilisés, et pour trouver, je cite:
    FT_STATUS (DWORD)
    FT_OK = 0
    FT_INVALID_HANDLE = 1
    FT_DEVICE_NOT_FOUND = 2
    FT_DEVICE_NOT_OPENED = 3
    FT_IO_ERROR = 4
    FT_INSUFFICIENT_RESOURCES = 5
    FT_INVALID_PARAMETER = 6
    FT_INVALID_BAUD_RATE = 7
    FT_DEVICE_NOT_OPENED_FOR_ERASE = 8
    FT_DEVICE_NOT_OPENED_FOR_WRITE = 9
    FT_FAILED_TO_WRITE_DEVICE = 10
    FT_EEPROM_READ_FAILED = 11
    FT_EEPROM_WRITE_FAILED = 12
    FT_EEPROM_ERASE_FAILED = 13
    FT_EEPROM_NOT_PRESENT = 14
    FT_EEPROM_NOT_PROGRAMMED = 15
    FT_INVALID_ARGS = 16
    FT_NOT_SUPPORTED = 17
    FT_OTHER_ERROR = 18
    L'idéal, pour avoir un message compréhensible au lieu d'un simple numéro (qui nécessiterait encore de retourner voir la documentation pour savoir ce qui s'est passé ) serait donc sans doute de créer une classe d'exception "personnelle", dérivée de std::exception, et prenant une forme proche de
    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
    class OpenExErro : public std::exception{   //Bien sur, tu peux adapter le nom comme tu veux ;)
    public:
        OpenExErro (FT_STATUS  errcode):errcode_{errcode}{
        }
        const char * what() const noexcept override{
            static const char * errors[]={"no error", "invalid handel","device not found","device not opened",
                                         "io error","insuficient ressources","invalid parameter",
                                         "invalid bad rate","device not opened for erase","device not opened for write",
                                         "failed to write device","failed to read eeprom","failed to write eeprom",
                                         "failed to erase eeprom","eeprom not present","eeprom not programmed",
                                         "invalid args","not supported","other error"};
            if(errcode_ >0 && errcode_ <17)
                return errors[errcode_];
            return errors[FT_OTHER_ERROR ];
        }
    private:
        FT_STATUS  errcode_;
    };
    Avec un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ftStatus = FT_OpenEx(m_SerialNumberX, FT_OPEN_BY_SERIAL_NUMBER, &m_ftHandle);
        if (ftStatus != FT_OK){
            throw OpenExErro(ftStatus);
    }
    /* tout ce qui doit être fait si la fonction FT_OpenEx a fonctionné sans problème */
    devrait te permettre de savoir pourquoi cette satanée fonction n'a pas voulu fonctionner. Selon le message que tu obtiendras, tu seras alors en mesure de corriger ton code
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut
    Bonjour,

    Merci pour le coup de main.

    J'ai copié et modifié le code parce que Visual Studio me dit qu'il est pas d'accord avec le code en état donc voilà le .h :
    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
    #pragma
    #include <exception>
    #include <ftd2xx.h>
    #include <iostream>
     
    class OpenExError : 
    	public std::exception 
    {   
     
    public:
    	OpenExError();
    	~OpenExError();
    	OpenExError(FT_STATUS);
     
    	const char* chat();
     
    private:
    	FT_STATUS  errcode_;
    };
    et le .cpp :
    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
    #include "OpenExError.h"
     
    OpenExError::OpenExError()
    {
     
    }
     
    OpenExError::~OpenExError()
    {
     
    }
     
    OpenExError::OpenExError(FT_STATUS  errcode)
    {
    	errcode_ = errcode;
    	chat();
    }
     
    const char* OpenExError::chat()
    {
    	static const char* errors[] = { "no error", "invalid handel","device not found","device not opened",
    								 "io error","insuficient ressources","invalid parameter",
    								 "invalid bad rate","device not opened for erase","device not opened for write",
    								 "failed to write device","failed to read eeprom","failed to write eeprom",
    								 "failed to erase eeprom","eeprom not present","eeprom not programmed",
    								 "invalid args","not supported","other error"};
     
    	if (errcode_ > 0 && errcode_ < 17)
    		return errors[errcode_];
     
    	return errors[FT_OTHER_ERROR];
    }
    Et j'ai bien sûr ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (ftStatus != FT_OK) 
    {
    	throw OpenExError::OpenExError(ftStatus);
    }
    Le résultat est le même, l'appli ne se lance pas.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut
    Bonjour,
    J'ai lancé le programme avec le périphérique connecté à mon pc et depuis, ça fonctionne.
    Donc ça venait bien du fait que le driver n'avait pas fini son installation.
    Merci pour le coup de main en tout cas, je penserai à mettre des boucles de contrôle et des exceptions dans mes fonctions

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

Discussions similaires

  1. [Python 2.X] Impossible de lancer mon programme externe depuis python
    Par johnsdoeuf dans le forum Général Python
    Réponses: 3
    Dernier message: 07/08/2014, 21h32
  2. [Eclipse] Impossible de lancer mon programme
    Par ycf16 dans le forum Android
    Réponses: 7
    Dernier message: 22/11/2013, 16h56
  3. [WS 2003] Impossible de lancer un programme avec un utilisateur Active Directory
    Par tom741 dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 17/12/2010, 11h24
  4. Impossible de lancer un programme depuis powerpoint
    Par adelsunwind dans le forum Powerpoint
    Réponses: 1
    Dernier message: 05/06/2009, 10h39
  5. Impossible de lancer mon programme, problème de compilation
    Par beegees dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/12/2008, 17h03

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