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

API standards et tierces Java Discussion :

[dll] libérer une dll apres utilisation


Sujet :

API standards et tierces Java

  1. #1
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 56
    Points
    56
    Par défaut [Résolu][dll] libérer une dll apres utilisation
    Bjr.
    J'utilise une dll que j'ai créée par JNI. Mon problème est qu'une fois utilisée, la dll est lockée (en cours d'utilisation). Or, je souhaiterai la libérer pour pouvoir la supprimer et la regénérer. Passer à null la classe qui la load ne suffit visiblement pas. Comment puis-je faire ?

  2. #2
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut Re: [dll] libérer une dll apres utilisation
    Citation Envoyé par polo54
    Passer à null la classe qui la load ne suffit visiblement pas.
    Peut-être en demandant le passage du gc apres le passage à null:
    Sans aucune garantie

  3. #3
    Membre averti
    Avatar de JHelp
    Inscrit en
    Octobre 2002
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 185
    Points : 444
    Points
    444
    Par défaut
    Je ne comprends pas bien ton problème.
    Je comprends deux choses :
    Soit, lorsque tu fermes ton application qui se servait de la dll, tu ne peux plus utiliser celle-ci, dans un autre prog.
    Soit, tu veux réinitialiser le lien avec la dll en cours d'éxécution, mais dans ce cas, je ne vois pas l'intéret, si tu as bien fait les choses, tu devrais pouvoir te servir de la même session tout au long du programme.
    JHelp

  4. #4
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 56
    Points
    56
    Par défaut
    joellel : j'ai déjà essayé et ça ne change rien.
    JHelp : C'est le 2ème *soit* qui m'interresse. J'ai besoin de réinitilaiser le lien : la dll en question est obtenue en lançant sa compilation par l'intermédiaire de mon appli, or, lorsque je l'ai utilisée une fois, elle est verrouillée et si je relance une compilation (suite à la modification de son source) celle-ci plante lorsqu'elle tente de re-générer la dll.

  5. #5
    Membre averti
    Avatar de JHelp
    Inscrit en
    Octobre 2002
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 185
    Points : 444
    Points
    444
    Par défaut
    Tu veux dire que tu modifie ta dll pendant le programme ???
    Une dll doit être statique définit une fois pour toute, puis utiliser, et non pas dynamique. Tu as un sérieux problème de conception quelque part.
    JHelp

  6. #6
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 56
    Points
    56
    Par défaut
    Je vois pas en quoi c'est un problème de conception.
    Le principe de l'appli est la gestion d'un service de cryptage à clé privée. On peut modifier cette clé de cryptage, ce qui génère un nouveau source de service (en C) qui archive les clés et lance sa compilation.
    Parallèlement, ce service est utilisé afin de crypter et de décrypter certaines infos en base.
    Il doit bien être possible de libérer la dll apres utilisation, non?

  7. #7
    Membre averti
    Avatar de JHelp
    Inscrit en
    Octobre 2002
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 185
    Points : 444
    Points
    444
    Par défaut
    Logiquement pour faire ce que tu demandes, on applique toujours le même algo, il suffit de stoké la clef dans un fichier. Tu n'as pas besoin de modifier ta dll de manière dynamique.
    C'est bien la première fois que j'entends quelqu'un qui veut modifier dynamiquement sa dll.
    Regarde du coté du package javax.crypto, il y a ce qu'il faut pour crypter et décripter tes données et c'est très sécurisé. L'avantage, tu n'as plus besoin d'une dll. Une dll, est toujours une solution à éviter autant que possible, pour des raisons de portabilité et de limitation d'action sur elle.

  8. #8
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 56
    Points
    56
    Par défaut
    Je suis d'accord avec toi sur le principe. Sauf que pour le cas présent c'était pas applicable car, si tu veux tout savoir, l'algo de cryptage est aussi utilisé sur AS400 et appelé par des modules Cobol et le fichier d'archivage des clés DOIT être contenu dans l'exécutable (et donc dans la dll entre autre). Il était d'autre part hors de question d'utiliser Java pour le cryptage. Java ne sert que pour l'élaboration d'une console d'administration qui doit aussi être capable de décrypter des informations qui ont été cryptées sur AS400.

    J'en reviens donc à ma question : est-il possible de libérer, tuer, écraser, cette :idc: de dll ?

  9. #9
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 56
    Points
    56
    Par défaut
    J'ai enfin trouvé un moyen pour libérer une dll pour ceux que ça intéresse :
    Il sufiit de créer son propre ClassLoader pour charger la class qui load la dll. Il ne faut pas que celle-ci soit chargée par le ClassLoader du System.
    Une fois que la dll a été utilisée, il suffit de virer toutes les références des classes chargées par le ClassLoader fait *maison* et de provoquer l'appel de sa méthode finalize(). La dll sera ainsi libérée du même coup.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 78
    Points : 49
    Points
    49
    Par défaut
    Hey hey !
    Ca fait maintenant un petit moment que je cherchais le moyen de libérer une library dynamique (je suis sous linux). Merci bcp pour le tuyau !
    Est-ce qu'il y aurait moyen que tu postes le code du classloader (où les grandes lignes) ?
    Merci d'avance

  11. #11
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 56
    Points
    56
    Par défaut
    Y'a moyen, mais c'est super vieux et je ne sais plus du tout comment ça marche...

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
    package sop.business;
     
    import java.io.*;
    import java.net.*;
    import java.util.*;
    import java.util.jar.*;
     
     
    public class CryptageClassLoader extends ClassLoader
    {
     
        private String root;
     
        /**
         * CONSTRUCTEUR PERMETTANT DE PASSER LE REPERTOIRE OU SE TROUVE LA CLASSE
         */
    //    public CryptageClassLoader (String rootDir)
    //    {
    //        if (rootDir == null)
    //          throw new IllegalArgumentException ("Null root directory");
    //        root = rootDir;
    //    }
     
        protected synchronized Class loadClass(String name, boolean resolve)
        throws ClassNotFoundException
        {
            if (name.equals("sop.business.Cryptage"))
            {
                return findClass(name);
            }
            else
                return super.loadClass(name,resolve);
        }
     
        public Class findClass(String name)
        throws ClassNotFoundException
        {
            try
            {
    //            String filename = name.replace ('.', File.separatorChar) + ".class";
                String filename = name.replace ('.', '/') + ".class";
                byte[] b = loadClassData(filename);
                return defineClass(name, b, 0, b.length);
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
                throw new ClassNotFoundException("IMPOSSIBLE DE TROUVER LA CLASSE DE CRYPTAGE");
            }
        }
     
    //    private byte[] loadClassData (String filename)
    //    throws IOException
    //    {
    //        // Create a file object relative to directory provided
    //        File f = new File (root, filename);
    //        // Get size of class file
    //        int size = (int)f.length();
    //        System.out.println(size);
    //
    //        // Reserve space to read
    //        byte buff[] = new byte[size];
    //
    //        // Get stream to read from
    //        FileInputStream fis = new FileInputStream(f);
    //        DataInputStream dis = new DataInputStream (fis);
    //
    //        // Read in data
    //        dis.readFully (buff);
    //
    //        // close stream
    //        dis.close();
    //
    //        // return data
    //        return buff;
    //    }
     
        private byte[] loadClassData (String filename)
        throws IOException
        {
            JarFile archive = new JarFile("MonProjet.jar");
            JarEntry entry = archive.getJarEntry(filename);
            byte[] contents = new byte[(int)entry.getSize()];
            DataInputStream stream = new DataInputStream(archive.getInputStream(entry));
            stream.readFully(contents);
            return contents;
    //        JarInputStream jis = new JarInputStream(new FileInputStream("MonProjet.jar"));
    //        JarEntry je = null;
    //
    //        while ((je = jis.getNextJarEntry()) != null )
    //        {
    //            if (je.getName().equalsIgnoreCase(filename))
    //            {
    //               byte[] tab = new byte[(int)je.getSize()];
    //               jis.read(tab,0,(int)je.getSize());
    //               jis.close();
    //               return tab;
    //            }
    //        }
    //        throw new IOException();
     
    //        while (bContinue)
    //        {
    //            je = jis.getNextJarEntry();
    //            if ( je == null )
    //                throw new IOException("Impossible de trouver la classe de cryptage");
    //            else if (je.getName().equalsIgnoreCase(filename))
    //            {
    //               byte[] tab = new byte[(int)je.getSize()];
    //               jis.read(tab,0,(int)je.getSize());
    //               jis.close();
    //               return tab;
    //            }
    //        }
    //        return null;
        }
     
        protected void finalize()
        throws Throwable
        {
            System.out.println("finalize");
            super.finalize();
        }
    }

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 78
    Points : 49
    Points
    49
    Par défaut
    Merci bcp !
    C'est très sympa !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 28
    Points : 12
    Points
    12
    Par défaut RegSvr32
    L'exécutable C:\Windows\System32\RegSvr32.exe permet de libérer une DLL :
    RegSvr32 /u /s "C:\Program Files\7-Zip\7-zip.dll"

    Cette commande est lancée par de nombreux désinstalleurs : il suffit de consulter le code source des projets hébergés sur SourceForge pour voir la commande RegSvr32 utilisée dans la partie désinstallation du script d'installation. Si ce script est destiné à NSIS (comme c'est souvent le cas) alors ce script est un *.nsi et on y trouve la commande ExecWait RegSvr32, suivie du Delete correspondant, dans la section "Uninstall".

    Attention : pour que cela fonctionne, vous devez impérativement fermer toutes les fenêtres de l'explorateur. Le processus explorer.exe peut tourner, ça ne gêne pas, du moment qu'il n'affiche pas de fenêtre. Si d'autres processus affichent des fenêtres, cela ne gêne pas.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/03/2012, 12h39
  2. Réponses: 1
    Dernier message: 23/12/2009, 12h50
  3. Libérer une dll
    Par tdk007 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/04/2008, 20h25
  4. utiliser une dll dans une dll
    Par anthonycosson dans le forum MFC
    Réponses: 2
    Dernier message: 09/05/2006, 22h42
  5. Utilisation d'une dll dans une application.
    Par jamais34 dans le forum MFC
    Réponses: 5
    Dernier message: 31/03/2006, 11h39

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