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++Builder Discussion :

FreeLibrary erreur constante(DLL c++)


Sujet :

C++Builder

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut FreeLibrary erreur constante(DLL c++)
    Bonjour à tous!! C'est mon premier post ici.

    Voila, j'ai un petit problème, j'essaye d'utiliser la méthode FreeLibrary pour libérer mon handle de DLL et ca me cause une exception lors de la fermeture de ma forme. Je peux cliquer dix fois sur mon bouton dans ma forme et cela ne me fait aucune erreur, c'est seulement a la fin que mon exception est soulevé.

    Pourtant, j'ai suivi un tutoriel ici sur les DLL et je crois bien avoir suivi ce qu'il fallait faire a la lettre.

    Voici mon code dans mon DLL que j'exporte:

    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
    #include <vcl.h>
    #include <windows.h>
    #pragma hdrstop
    #include "unit1.h"
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    extern "C" __declspec(dllexport)  __stdcall void Vic(int iWaiterNumber,int iInvoiceNumber,long lAmount,int iMode);
     
    //Ici,c'est la fonction que j'ai rajouté
    void __stdcall Vic(int iWaiterNumber,int iInvoiceNumber,long lAmount,int iMode)
    {
     
    	string fichierSignet = "fichier.xml";
     
    	//Création du fichier texte
    	ofstream fichier(fichierSignet.c_str(),ios::out);
    	fichier << "Contenu du fichier34343"  ;
     
    	fichier.close();
     
     
    	int Trans;
    	Trans=iWaiterNumber;
     
    }
    Voila maintenant le code dans mon application ou j'utilise la fonction de mon dll qui crée un fichier xml .


    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
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	typedef void ( __stdcall *MYDLLFUNC2) (int iWaiterNumber,int iInvoiceNumber,long lAmount,int iMode);
     
        MYDLLFUNC2 ImpFuncDLL;
    	TDateTime dtAfter, dtBefore;
    	String DayApres;
    	BOOL fFreeResult;
    	int Retour;
     
    	int iRet;
     
    	String DLLSource="pjXMLDLL.dll";
    	if (hinstDLL=LoadLibrary("pjXMLDLL.dll")) {
     
    		ImpFuncDLL = (MYDLLFUNC2)GetProcAddress(hinstDLL, "Vic");   
     
    		if (ImpFuncDLL)
    		{
    			ImpFuncDLL(14,1,134.56,5);
                                           FreeLibrary(hinstDLL);
    		}
     
    	}
     
    }
    Voila, je fais le freelibrary a la bonne place pourtant, qqun pourrait m'éclairez svplait!!

    Sam

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Salut Sam,
    Je ne vois pas de soucis dans ton FreeLibrary (il est mal placé cependant, il faut le mettre en dehors de la condition if (ImpFuncDLL) mais ce n'est pas ça qui provoquerait un crash).
    As-tu essayé juste un LoadLibrary suivi d'un FreeLibrary, c-a-d sans la ligne ImpFuncDLL(14,1,134.56,5);.
    Une hypothèse : Il suffit que le path de ton fichier en output ne soit pas bon pour que ça plante. Je ne connais pas bien ofstream alors je ne peux pas dire, mais quand je manipule des fichiers je met toujours le full path.

    Yarp

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Oui, tu as bien raison, je viens de tester, si j'enlève les opérations de création de mon fichier dans mon dll je peut libérer mon handle de ma librairie alors dans mon application...

    Alors je ne sais pas s'il faudrais que j'utilise une autre classe pour créer mon fichier dans mon dll. Je vais regarder ca...

    Sam

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je regarde tjrs ca et je n'y arrive pas, pourquoi lorsque je crée un fichier avec la classe ofstream, il m'enpêche alors de faire un freelibrary de mon handle de mon dll. J'ai utilisé la classe fstream et ca n'as pas l'air plus de fonctionner.

    Merci de votre aide!!
    Sam

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Parceque ce n'est pas FreeLibrary le problème mais ton implémentation de ofstream qui pour une raison ou une autre provoque une erreur. Tu ferais bien de tester cette partie du code a part.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Oui mais j'ai déja testé sur un autre bouton le même code directement dans mon programme pour créer mon fichier et ca marche sans aucun problème!!
    Et ca crée mon fichier etc... alors c'est pour cela que je trouve ca étrange...

    Merci!
    Sam

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Tu peux essayer sans FreeLibrary, il n'est pas obligatoire de librérer la dll après l'avoir ouverte. Evidemment il faudra fixer ça quand tu auras trouvé le problème, mais faire un LoadLibrary sans FreeLibrary ne pose pas de pb (Windows fermera la dll a la fin de ton programme de toute façon).

    Je te conseillerais aussi de loguer (faire un log) de l'entrée dans ta fonction (dans la dll) et de t'assurer que tu reçoit bien les valeurs attendus (et non pas un pointeur a la place d'une variable ou vice-versa).

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Je n'aime pas trop ce code !
    Tu peux cliquer autant de fois que tu veux, si la dll est introuvable on a toujours une erreur.
    En espérant que la compilation corresponde exactement à ce qu'on en attend au niveau d'une initialisation dont le résultat sert de test.
    Si c'est le cas, la dll n'est jamais chargée (alors que tu crois que tout s'est bien passé)... et alors, c'est un autre problème !

    Ce code mérite que l'on y rédige de quoi signaler les erreurs :
    - dll introuvable
    - ressource inconnue

    A plus !

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Oui c sur, je faisais un test ici car je ne comprenais pas pkoi ca me générait une erreur lorsque je fermais ma forme a la fin et pas a chaque freelibrary sur le bouton. Je rajouterai un try.. catch pour gérer mes erreurs, je ne l'avais pas encore fait c tout car je suis débutant en c++, je fais plus de delphi et c sharp!!

    Mais ca ne règle tjrs pas mon problème, c'est sur que si l'utilisateur clique sur mon bouton et fermerait mon programme, je n'aurais pas vraiment a faire de freelibrary car ca se gérerait tout seul. Seulement ici, je dois m'assurer que l'utilisateur peut cliquer sur le bouton souvent sans que mes ressources ne diminuent trop vu que je n'utiliserais pas de freelibrary. J'ai testé et ma mémoire disponible diminue tjrs.. alors je crois que je devrais régler ce problème.

    Pour faire un fichier log, comment s'y prend on je ne l'ai jamais fait sous c++ merci!!

    Sam

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    J'aurais fait quelque chose dans ce genre là :

    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
    String DLLSource = "pjXMLDLL.dll"; //chemin complet de la dll ???
    hinstDLL = LoadLibrary(DLLSource);
    if(hinst == NULL)
        {
        ShowMessage("Dll introuvable");
        }
    else
        {
        ImpFuncDLL = (MYDLLFUNC2)GetProcAddress(hinstDLL, "Vic"); 
        if(ImpFuncDLL == NULL) 
            {
            ShowMessage("Ressource introuvable");
            }
        else 
            {
            ImpFuncDLL(14,1,134.56,5);
            }
        //Comme ici on a chargé une dll, on la libère
        FreeLibrary(hinstDLL);
        //hinstDLL = NULL; //vérifier si elle n'est pas libérée en aval
        //dans la séquence de fermeture (par simple distraction... ça arrive à d'autres)
        }
    A plus !

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Voici la réponse qui a l'air d'avoir bel et bien réglé mon problème!!

    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
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     
                 HINSTANCE hinstDLL;
                 MYDLLFUNC2 ImpFuncDLL;
    	TDateTime dtAfter, dtBefore;
    	String DayApres;
    	BOOL fFreeResult;
    	int Retour;
     
    	int iRet;
     
    	String DLLSource="pjXMLDLL.dll";
    	hinstDLL=LoadLibrary(DLLSource.c_str());
    	if (hinstDLL==NULL) {
     
    		ShowMessage("Dll introuvable");
     
    		}
    		else
    		{
    		ImpFuncDLL = (MYDLLFUNC2)GetProcAddress(hinstDLL, "Vic");
    		if(ImpFuncDLL == NULL) 
            {
            ShowMessage("Ressource introuvable");
    		}
    		else
    		{
    			ImpFuncDLL(14,1,134.56,5);
    		}
     
     
    		   //Comme ici on a chargé une dll, on la libère
    		   FreeLibrary(DLLSource.c_str());
    		   //hinstDLL = NULL; //vérifier si elle n'est pas libérée en  aval
    		   //dans la séquence de fermeture (par simple  distraction... ça arrive à d'autres)
    		}
     
    }
    Pour en fait libérer ma librairie, j'apelle seulement le freelibrary sur le nom de mon dll et non de l'objet HInstance de mon dll que j'ai loadé avec loadlibrary.
    Comme ca, j'ai effectuer l'opération 50 fois et ca ne prend pas plus de mémoire,toutefois je ne comprend pas que dans les exemples il libère a partir de l'objet Hinstance, est ce que je me suis trompé à quelque part?

    Sam

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    BOOL FreeLibrary(

    HMODULE hLibModule // handle to loaded library module
    );
    Normalement, il me semble que la chaîne devrait comporter le chemin complet de la dll... Non ???

    Donc déjà il y a probablement un problème dès le départ...

    Salut !

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Non, en fait je n'ai pas du tout besoin du chemin au complet. Car lorsque par exemple j'inscris le chemin xdp.dll, ca va chercher dans le dossier ou mon projet est situé le dll xdp.dll. Car mon programme marche très bien avec le chemin que je lui donne la, c'est un peu comme en delphi tu n'as pas toujours besoin du chemin complet mais parfois oui.

    Alors, voila je le libère en lui redonnant le chemin du dll, est-ce correct?
    Sam

  14. #14
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    Citation Envoyé par Ninjagaiden24
    Non, en fait je n'ai pas du tout besoin du chemin au complet. Car lorsque par exemple j'inscris le chemin xdp.dll, ca va chercher dans le dossier ou mon projet est situé le dll xdp.dll. Car mon programme marche très bien avec le chemin que je lui donne la, c'est un peu comme en delphi tu n'as pas toujours besoin du chemin complet mais parfois oui.

    Alors, voila je le libère en lui redonnant le chemin du dll, est-ce correct?
    Sam
    je ne pense pas que la DLL soit libérée ainsi. A vérifier en testant la valeur retournée par FreeLibrary. Normalement, l'argument de FreeLibrary est bien le HModule renvoyé par LoadLibrary et non le chemin d'accès à la DLL.

    Nicolas

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    finalement j'ai fait un autre test, et je ne fais pas le freelibrary du tout et ca n'as pas l'air de déranger meme si je clique sur le bouton à répétition. Ma mémoire de disponible ne baisse pas alors je n'aurais peut-être pas besoin de le faire?

    Merci!!
    Sam

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/04/2008, 19h32
  2. Erreur => LIBMYSQL.dll
    Par wolfjeremy dans le forum Outils
    Réponses: 2
    Dernier message: 22/12/2005, 15h39
  3. erreur avec dll sous winXP sp2 / IIS5.1
    Par totoche dans le forum ASP
    Réponses: 10
    Dernier message: 12/12/2005, 16h27
  4. Erreur compilation DLL dans Eelphi 6
    Par jakouz dans le forum Langage
    Réponses: 2
    Dernier message: 25/05/2005, 16h38
  5. [C#] Erreur mscoree.dll
    Par Damsou dans le forum Windows Forms
    Réponses: 12
    Dernier message: 20/01/2005, 11h56

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