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, COM et SDKs Delphi Discussion :

D'où venons nous ?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Par défaut D'où venons nous ?
    Bonjour

    Contexte : Delphi 7, windows XP

    Dans le code source d'un exécutable delphi il est possible
    d'écrire une instruction qui, au moment de l'exécution, indique
    à partir de quel fichier disque s'est chargé le programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    showmessage(Application.exename);
    Est-il possible de faire quelque chose d'équivalent dans le code d'une
    DLL ? C'est à dire écrire un code (dans la DLL elle même et pas dans l'exécutable qui la charge) qui, une fois la DLL chargée permet de connaître à partir de quel fichier physique elle a été chargée.

    Quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    showMessage(CheminFichierDLLCourante);
    Cela pourrait permettre, par exemple, de faire, dans la DLL, un traitement
    dépendant du chemin physique à partir duquel a été chargée la DLL.

    Précision 1 : je ne veux pas devoir passer le texte du chemin à une
    fonction ou procédure de la DLL depuis le programme principal (ça je
    sais faire).

    Précision 2 : si on sait me dire comment récupérer le handle de la DLL dans le processus courant (et cela dans la DLL) alors mon problème est résolu
    car je sais retrouver le fichier à partir du handle.

    Voilà, si quelqu'un s'est déjà intéressé à cette question hautement philosophique...

    Merci.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    en passant par le ProcessID...avec GetModuleFileNameEx()
    alors dans ta DLL,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    USES Psapi;
     
    var
        hProcess:DWORD;
        FileNamePath: array[0..512] of Char;
    begin
        hProcess:=OpenProcess( PROCESS_QUERY_INFORMATION OR PROCESS_VM_READ,
                               FALSE,
                               GetCurrentProcessId);
        // Recupère le chemin du Exe qui appele la dll
        GetModuleFileNameEx(hProcess,0,FileNamePath,sizeof(FileNamePath));
        CloseHandle(hprocess);
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Par défaut
    Ceci permet effectivement de retrouver le chemin de l'éxécutable depuis
    une DLL.

    A partir du nom de la DLL (c'est généralement le nom du projet Delphi, qui
    est bien sur connu lorsque l'on code la DLL) on peut retrouver le fichier par :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    USES Psapi;
     
    var
        hProcess:DWORD;
        FileNamePath: array[0..512] of Char;
    begin
       hModule:=GetModuleHandle(<nom_lib_sans_extension_en_dur>)
       GetModuleFileName(hModule,FileNamePath,sizeof(FileNamePath));
    end
    Mais il peut arriver qu'à travers le système de fichiers Windows le fichier
    DLL soit renommé et dans ce cas l'API "GetModuleHandle" renvoie 0,
    et je ne sais pas à partir de quel fichier j'ai été chargé.

    Etonnant non ?

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    tu dois utiliser la variable globale implicite HIstance qui va te donner le handle de la DLL en cours

    Dès lors le code devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function GetDLLFilePath: String;
    var
      ModuleFilename : array[0..MAX_PATH] of Char;
    begin
      GetModuleFileName(HInstance, ModuleFilename, SizeOf(ModuleFilename));
      Result := ModuleFilename;
    end;

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Par défaut
    Bonsoir,

    malgré l'heure tardive j'ai vérifié et ça marche très bien !

    Merci.

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

Discussions similaires

  1. Merci de nous aider à créer des ressources (FAQ et sources)
    Par Community Management dans le forum Evolutions du club
    Réponses: 29
    Dernier message: 19/10/2015, 00h35
  2. [LIVRES] Vos avis nous intéressent !
    Par Maxence HUBICHE dans le forum Livres
    Réponses: 21
    Dernier message: 30/01/2013, 17h33

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