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 lors de l'utilisation d'une fonction d'une DLL


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut Erreur lors de l'utilisation d'une fonction d'une DLL
    Bonjour,

    j'ai un réel problème à lire une fonction contenue dans une DLL. Mon code est présenté ci-dessous. En mode DEBUG, le programme semble voir la DLL et la fonction, car ma variable verification indique 1.

    Cependant, lorsque j'arrive à la ligne où j'appelle ma fonction :

    XsatTPtillnerroth4(T,P,&variable_out1,&variable_out2,&variable_out3,&variable_out4,&variable_out5,&variable_out6,&variable_out7,&variable_out8);

    j'ai cette erreur : Unhandled exception at 0x0d69ca14 in CC6.exe 0xC0000005 : Access violation reading location 0x41430329.

    J'ai l'impression que cela a rapport avec mes pointeurs ... mais je suis assez débutant en C ++ alors je ne suis pas certain.

    Quelqu'un peut m'aider avec ceci ?

    Merci

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    void addk(float *y, float *x, double t, double p, float *xkv)
    {	
    	//On défini le format de la fonction 1 de Brice à aller chercher
    	typedef void(_stdcall* FunctionDLL_1)(double,double,double*,double*,double*,double*,double*,double*,double*,double*);
     
    	// On commence par mettre la température et la pression dans les unités de la DLL de Brice
    	// Présentement, elles sont dans les unités internes de CHEMCAD (RANKINE et PSIA)
    	double T = t*0.5556;
    	double P = p*0.0068948;
     
    	// On défini le chemin de la DLL
    	HINSTANCE DLL_path;
    	FunctionDLL_1 XsatTPtillnerroth4;
    	DLL_path = LoadLibrary("./propthermo.dll");
    	XsatTPtillnerroth4 = (FunctionDLL_1)GetProcAddress(DLL_path,"XsatTPtillnerroth4");
     
     
    	double verification;	
     
    	if (XsatTPtillnerroth4 != NULL)
    	//if (PRESSdll != NULL)
    	{
    		verification = 1;
    	}
    	else
    	{	
    		verification = 0;
    	}
     
    	//On défini les variables à utiliser dans les fonctions en entrée et sortie
    	double variable_out1;
    	double variable_out2;
    	double variable_out3;
    	double variable_out4;
    	double variable_out5;
    	double variable_out6;
    	double variable_out7;
    	double variable_out8;
     
    	//On appelle alors la fonction en définissant en premier le nom des variables
    	XsatTPtillnerroth4(T,P,&variable_out1,&variable_out2,&variable_out3,&variable_out4,&variable_out5,&variable_out6,&variable_out7,&variable_out8);
     
     
    	// On libère la dll après sont calcul
    	FreeLibrary(DLL_path);
     
    }

  2. #2
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    XsatTPtillnerroth4 = (FunctionDLL_1)GetProcAddress(DLL_path,"XsatTPtillnerroth4");
    Est-ce que tu es sur que c'est bien la signature de ta fonction de dll dans les quotes?

    Si tu utilises directement un .def pour indiquer les fonctions exportées par ta dll, alors ça devrait passer.

    Part contre si tu es sous visual studio et que tu utilises "__declspec( dllexport )" alors le nom de ta fonction sera généré et décoré. Vérifie dans le .def généré pour voir si le nom corresponds bien réellement?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    Je ne connais pas trop les DLL, mais je n'ai pas de fichier .def, mais seulement propthermo.dll qui a été généré à partir de code fortran.

    J'ai par contre utilisé le logicial DEPENDENCY WALKER pour savoir les modules à utiliser avec ma dll. Dans ce logiciel, le nom des fonctions présentes étaient inscrites et il s'agissait bien exactement de XsatTPtillnerroth4.

    De plus, est-ce que ma variable vérification serait égale à 1 si je n'avais pas le bon nom de fonction ?

  4. #4
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Oui, je posais la question dans le doute, parcequ'il y aurait pu y avoir une autre fonction avec une signature différente (et qui aurait du coup pas exactement le même nom, peut être avec des décorations).

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Mais la fonction utilise bien _stdcall ?
    C'est une source classique d'erreur avec les DLLs

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    En fait, ma fonction dans ma dll provient d'un code FORTRAN. Est-ce que le _stdcall est pas défaut celui de Fortran ?

    De plus, je me demandais si je devais utiliser un EXTERN "C" quelques part vu que c'est un dll venant du fortran.

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

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Réponses: 3
    Dernier message: 27/05/2008, 23h07
  3. [PHPMailer] Erreur lors de l'utilisation de la fonction mail
    Par onlytime dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 04/04/2008, 16h11
  4. Réponses: 3
    Dernier message: 29/04/2006, 13h02
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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