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

Langage Delphi Discussion :

Déchargement dll et C#


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut Déchargement dll et C#
    Bonjour,

    Je suis confronté à un problème de déchargement de DLL.
    Cette DLL est chargée par un programme en C#, mais elle n'est pas déchargée comme il faut (je n'ai pas accès au code de ce prog en C#).
    Je cherche donc, a la fin de l'appel d'une fonction exportée de cette DLL, la décharger de la mémoire.

    Est ce possible à votre avis ?
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  2. #2
    Membre actif
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 105
    Points : 235
    Points
    235
    Par défaut
    Salut,
    Oui, il ya les procédures
    LoadLibrary, GetProcAddress, FreeLibrary. Exemple pris dans ma vieille doc Delphi:
    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
    uses Windows, ...;
    type
      TTimeRec = record
        Second: Integer;
        Minute: Integer;
        Hour: Integer;
      end;
     
      TGetTime = procedure(var Time: TTimeRec);
      THandle = Integer;
    var
      Time: TTimeRec;
      Handle: THandle;
      GetTime: TGetTime;
      ...
    begin
      Handle := LoadLibrary('DATETIME.DLL');
      if Handle <> 0 then
      begin
        @GetTime := GetProcAddress(Handle, 'GetTime');
        if @GetTime <> nil then
        begin
          GetTime(Time);
          with Time do
            WriteLn('Il est ', Hour, ':', Minute, ':', Second);
        end;
        FreeLibrary(Handle);
      end;
    end;
    Bonne recherche.
    solilog

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    si j'ai compris le problème c'est qu'une AUTRE application (C#) ne libère pas la DLL.

    il doit être possible de fermer le Handle (ProcessXP sait le faire par exemple), mais si l'application utilise encore la DLL elle risque de planter au prochain appel.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    si j'ai compris le problème c'est qu'une AUTRE application (C#) ne libère pas la DLL.

    il doit être possible de fermer le Handle (ProcessXP sait le faire par exemple), mais si l'application utilise encore la DLL elle risque de planter au prochain appel.
    Merci Paul de t'être penché sur mon problème

    Effectivement, je ne peux faire de freelibrary dans le programme en C#, par contre ma DLL est bien chargée avant chaque appel de foncton via un loadlibrary.
    Donc le programme C# a toujours un handle de valide.
    Par contre si je sais tuer un process à partir d'un programme, je n'ai jamais tenté de le faire à partir d'une DLL pour la tuer elle même, un suicide en fait...Ma DLL doit s'auto détruire et là à mon avis je vais me chopper une violation d'accès.
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  5. #5
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Citation Envoyé par solilog Voir le message
    Salut,
    Oui, il ya les procédures
    LoadLibrary, GetProcAddress, FreeLibrary. Exemple pris dans ma vieille doc Delphi:

    Bonne recherche.
    solilog
    Solilog,

    tu n'as pas bien compris ma question, le code que tu me donnes m'est bien connu, mais le problème n'est pas là.

    Merci d'avoir tenté d'y répondre.
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    tu dois chercher du côté des injections de code à priori

    http://stackoverflow.com/questions/8...-process-win32
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Est-ce que tu récupère les DllEntryPoint ATTACH et DETACH ?

    Est-ce le garbage collector qui laisserait trainer un truc ?
    l'Application C#, si tu en as pas le code, en as-tu le binaire pour tester ?
    Si oui, est l'Application C# se termine correctement (pas de process qui traine vue par Sysinternals ProcessMonitor)


    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
     
    library MonMaitreCastor;
     
    ...
     
    procedure DllEntryPoint(dwReason : dword);
    begin
      case dwReason of
        DLL_PROCESS_ATTACH : ...
        DLL_PROCESS_DETACH : ...
        DLL_THREAD_DETACH : ...
      end;
    end;
     
    begin
      DLLProc := @DllEntryPoint;
      DLLEntryPoint(DLL_PROCESS_ATTACH); 
    end.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. PB Déchargement DLL avec Socket
    Par zawab dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 08/03/2011, 22h07
  2. Chargement/Déchargement de DLL
    Par mister3957 dans le forum C++
    Réponses: 1
    Dernier message: 13/05/2009, 21h52
  3. Réponses: 2
    Dernier message: 08/03/2009, 11h09
  4. Déchargement de dll et évenement
    Par Bart_lx dans le forum Windows
    Réponses: 2
    Dernier message: 27/12/2007, 16h45
  5. Evenement au déchargement d'une dll par windows
    Par peijnoob dans le forum Windows
    Réponses: 3
    Dernier message: 22/06/2007, 09h54

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