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

Visual C++ Discussion :

chargement dynamique d'une DLL écrite en C dans DLL écrite en C++


Sujet :

Visual C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Par défaut chargement dynamique d'une DLL écrite en C dans DLL écrite en C++
    Bonjour à toutes

    Actuellement j'essaye de créer une DLL écrite en C++ que je devrais utiliser
    dans un logiciel de simulation de réseaux électriques. Cette DLL fait appel à une autre DLL écrite en C. pour celà j'utilise un loadlibrary(), cependant ce dernier me renvoie un "NULL", en sachant que dans le header de la DLL écrite en C j'ai utilisé un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    /* functions prototypes */
     
     
    #ifdef __cplusplus
    }
    #endi
    ma question est la suivante :

    est ce que le bout de code que j'ai introduit ne suffit pas pour que la DLL soit chargée normalement ?

    et si c'est oui, dois je créer un wrapper C++

    PS: Je suis pas informaticien et je débute en C++, donc excusez mon vocabulaire technique en cas d'erreur.

    Merci d'avoir pris le temps de me lire.

    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    extern "C" affecte GetProcAddress(), mais pas LoadLibrary().

    Que dit GetLastError() quand LoadLibrary() échoue?
    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.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Par défaut
    Bonjour,
    Merci pour votre réponse

    Alors j'ai pensé à mettre GetLastError() pour voir l'origine de l'erreur mais comme c'est une DLL que je développe là je peux pas déboguer (enfin je sais si y a un moyen de faire ça)
    le seul moyen pour moi de voir si ça marche ou pas est de générer la DLL écrite en C++ et de l'appeler dans mon circuit de simulation. Voilà le bout de code de la DLL en C++ pour le chargement de la dll écrite en C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    HINSTANCE hInstDLL;
    hInstDLL=LoadLibraryA("RTTCalculator.dll");
     
    if (hInstDLL==0)
    {
    this->rttcalcInitialize=(I_FUNC_C_I_S)GetProcAddress(hInstDLL,"rttcalcInitialize");
    courant=0;
    }
    else courant=1;
    donc "courant" c'est la valeur de sortie de mon simulateur, j'ai fais ça pour m'assurer que la DLL se charge bien mais le je reçois "courant=0" donc j'ai supposé que loadlibrary() échoue.

    J’espère être clair dans ce que je viens de dire

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Le code que tu viens de poster met courant à zéro si LoadLibrary() a réussi, et à 1 sinon.
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Par défaut
    désolé, c'était juste une faute de saisie
    donc le loadlibrary() renvoie toujours un NULL
    J'ai trouvé dans d'autres forums des topic ou ça parlait de chargement DLL
    et de wrapper et en cherchant sur net j'ai pas trouvé grand chose sur les wrapper donc c'est pour cela que je pose la question ici, parce que pour être franc j'ai appris pas mal de trucs ici depuis que j'ai commencé mon projet, en espérant trouver une réponse.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 464
    Par défaut
    Avez-vous toujours le problème ?

    GetLastError
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx devrait nous indiquer le problème.
    Mais à utiliser immédiatement après l'appel à LoadLibraryA.

  7. #7
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Avez-vous essayer :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hInstDLL=LoadLibraryA("C:\\Nom du dossier + sous-dossier\\RTTCalculator.dll");
    If the string specifies a full path, the function searches only that path for the module.

    If the string specifies a relative path or a module name without a path, the function uses a standard search strategy to find the module; for more information, see the Remarks.

    If the function cannot find the module, the function fails. When specifying a path, be sure to use backslashes (\), not forward slashes (/). For more information about paths, see Naming a File or Directory.
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Par défaut
    Bonjour à Tous
    Merci pour vos réponses, j'ai enfin réussi à résoudre le problème

    En effet au départ je pouvais pas mettre un GetLastError (), et après avoir creuser dans la documentation relative au logiciel sur lequel je travail j'ai pu trouver comment déboguer un programme avec le mode Debug.

    Et pour revenir au problème, mes lignes de code étaient justes. Ils suffisait seulement de vérifier les propriétés du fichier solution (.sln) ou je devais rajouter certaines commandes bien spécifiques à mon logiciel de simulation.

    Cordialement.

Discussions similaires

  1. [D7] EConvertError lors du chargement dynamique d'une dll
    Par declencher dans le forum Langage
    Réponses: 3
    Dernier message: 11/02/2015, 13h52
  2. [ClassLoader] Chargement dynamique d'une classe -> problème avec packages !
    Par ymerej dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 31/05/2006, 21h37
  3. Réponses: 2
    Dernier message: 25/10/2005, 18h03
  4. [CR.NET]Chargement dynamique d'une image
    Par Moah dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 14/12/2004, 11h46
  5. Réponses: 19
    Dernier message: 26/04/2004, 08h54

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