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 :

Problème pour l'appel des fonctions contenues dans un DLL


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    Points : 67
    Points
    67
    Par défaut Problème pour l'appel des fonctions contenues dans un DLL
    Bonjour,

    Je développe un programme en C++ sous Visual Studio. Ce programme fait appel à une DLL FuncDLL.dll écrite en C++. J'appelle notamment la fonction fctDLL(arg1, arg2) comme décris ci-dessous:

    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
     
    #include "stdafx.h"
    #include "FuncDLL.h"
    #include <math.h>
     
    void main_func(bool isCalled)
    {
     
     ...
      if(isCalled)
     {
         fctDLL(arg1, arg2)
     }
     ...
    }
    NB: #include "FuncDLL.h" est le header de la fonction dans la DLL.

    J'ai ajouter les répertoires includes et lib de la DLL dans mon projet. Le programme se compile et s’exécute normalement.

    Par contre je voudrais pouvoir choisir si j'ai besoin de la DLL ou pas. Dans le programme l'appel à la fonction DLL est soumis à une valeur booléenne. mais qu'on j’exécute ce programme sans ajouter la DLL à mon dossier courant j'ai un message d'erreur (DLL manquante) alors que la booléenne est à false.

    Je voudrais ainsi pouvoir liée la nécessité de la présence ou pas de la DLL à la valeur de la booléenne anisi que pouvoir paramétrer le dossier contenant la DLL. Je suis obligé de l'ajouter dans le répertoire courant du programme pour que cela fonctionne.

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    Si tu es sous windows regarde du côté des fonction delayload. Sinon si tu as la possibilité d'installer boost 1.61 ils viennent d'ajouter une lib dont c'est l'objectif: boost.dll.
    Enfin en plus sommaire, il y a l'entrée suivante de la FAQ: Comment-charger-explicitement-une-bibliotheque-dynamique simple mais efficace.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    Points : 67
    Points
    67
    Par défaut
    Merci pour votre aide,

    J'ai suivi le tuto que vous m'avez indiqué CedricMocquillon et je l'ai intégrè à mon projet et j'ai eu une access violation. J'ai créé un projet très simple pour tester le processus et j'ai eu aussi cet access violation. J'ai mis ci-dessous ce projet test avec une DLL test "TestDLL.DLL"

    fichier .h de la DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    #define TestDLL_API __declspec(dllexport) 
     
    TestDLL_API  int Addition(int a, int b);
    fichier.cpp de la DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "stdafx.h"
    #include "TestDLL.h"
     
    int Addition(int a, int b)
    {
    	return a + b;
    }
    projet test pour appel de la DLL:
    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
     
    #include "stdafx.h"
    #include <windows.h>
    #include <iostream>
    int _tmain(int argc, _TCHAR* argv[])
    {
     
    	int res;			
    	HINSTANCE DLLHandle;
    	typedef int(*ptr_function)(int,int);   
    	ptr_function _ptr_function;
     
    	DLLHandle = LoadLibrary(LPCWSTR("TestDLL.dll"));
     
    	_ptr_function = (ptr_function)GetProcAddress(DLLHandle,"Addition");
    	res = _ptr_function(4,6);
     
    	FreeLibrary(DLLHandle);
     
    	return 0;
    }
    J'ai une access violation à l’exécution de la fonction _ptr_function. Je sais pas si y a pas un problème avec le nom de la DLL aussi puisque dans list automatique des variables locales l'instance DLLHandle st unused "Erreur: impossible d'évaluer l'expression"

    Si vous avez une idée sur ce qui pose problème dans ce code

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Vous compliquez pas la vie inutilement, utilisez les options /DELAYLOAD, c'est nettement plus simple et plus sûr.

    Vous n'avez même pas fait attention aux méthodes de décorations des noms différentes entre le C et le C++.
    Si la phrase précédente ressemble à du chinois pour vous, c'est qu'il est temps de prendre les méthodes de notre XXIème siècle et pas celle du Trias de l'informatique: /DELAYLOAD.

Discussions similaires

  1. Appeler des fonctions listées dans un tableau
    Par MarieNum dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 01/01/2009, 17h31
  2. [POO] appeler une fonction contenue dans une autre fenetre
    Par pepper18 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/09/2008, 02h27
  3. Réponses: 2
    Dernier message: 19/09/2006, 19h06
  4. Utiliser des fonctions contenues dans un fichier .bas
    Par usbeck dans le forum Visual C++
    Réponses: 4
    Dernier message: 11/08/2006, 12h03
  5. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33

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