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

Windows Discussion :

Comment une dll peut-elle obtenir son chemin d'accès ?


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Comment une dll peut-elle obtenir son chemin d'accès ?
    Bonjour !
    alors voila, je voudrais faire une dll capable d'obtenir son chemin d'accès, mais ca marche pas. Voila le problème :
    Ma DLL contient la fonction suivante, qui normalement doit afficher son chemin d'accès, soit C:\MesDocs\maDll.dll ( pour schématiser ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define DLLEXPORT   __declspec (dllexport)
    
    void DLLEXPORT fonction ( void )
    {
        char pathname[256];
        
        HMODULE hMe = GetModuleHandle(NULL); 
        DWORD nRet = GetModuleFileName(hMe, pathname, 256);
        MessageBox(0, pathname, "Chemin de la DLL", MB_ICONINFORMATION);
    }
    Et j'ai une application qui doit activer la fonction de ma dll :
    Ok, je lance l'application, et la ca m'affiche le chemin d'accès de l'application ( on a qu'a dire C:\MesDocs\monAppli.exe ), et pas de la DLL !!
    Comment faire pour que ma DLL trouve son chemin toute seule ?
    Merciiii !

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Le paramètre NULL pour GetModuleHandle fait toujours référence à l'exécutable.

    Pour avoir le chemin de ta dll depuis celle-ci, prend le HANDLE (parfois un HINSTANCE) de ta dll que tu peux récupèrer lors de son initialisation et sauve le en variable globale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BOOL APIENTRY DllMain( HANDLE hModule, // à sauver
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
    					 )
    Ensuite, depuis ta fonction "fonction" tu passes ce HANDLE à la fonction GetModuleFileName(), tu aura le chemin complet dans le buffer.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Je n'y arrive pas. En faite je dois pas bien m'y prendre pour la sauvegarde de l'hinstance ( c'est pas un handle d'ailleurs, ca change quelque chose ? )
    Enfin voila ce que ca donne :

    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
    char HINST[256]; // variable globale
    
    BOOL APIENTRY DllMain ( HINSTANCE hinst, DWORD raison, LPVOID reserv )
    {
        if ( raison == DLL_PROCESS_ATTACH )
            HInst = hinst;
        sprintf(HINST, hinst); // euh... c'est vraiment la bonne fonction ?
        return TRUE;
    }
    
    
    void DLLEXPORT fonction ( void )
    {
        char pathname[256];
    
        //HMODULE hMe = GetModuleHandle(NULL); // on supprime, puisque c'est pour l'exécutable
        DWORD nRet = GetModuleFileName(HINST, pathname, 256);
        MessageBox(0, pathname, "Chemin de la DLL", MB_ICONINFORMATION);
    }
    Déjà j'ai un warning pour la conversion invalide du sprintf et le pointeur incompatible de GetModuleFileName, et quand je lance l'appli qui utilise la fonction de la dll :
    "I%"
    Bouhhh !

    PS : Merci encore pour ton aide !

  4. #4
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Là, ce n'est même pas un problème de WinAPI, mais plutôt de C... tu ne peux pas inscrire dans une chaîne une instance ! -je ne vois d'ailleurs pas l'intérêt...-

    Tu peux par contre faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HINSTANCE instance;
    
    //...
    
    instance = hThisInstance;
    Vive l'embarqué.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Bonjour,

    Citation Envoyé par jenez
    [...] hinstance ( c'est pas un handle d'ailleurs [...]
    Et le "H" de "HINSTANCE", que veut-il dire ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Ca marche nikel ! Merci beaucoup !

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par David.Schris
    Bonjour,

    Et le "H" de "HINSTANCE", que veut-il dire ?
    Ce n'est pas un "Vrai" handle, et ce n'est certainement pas un HANDLE (le type HANDLE étant pour moi réservé aux objets Kernel).

    Bien que HINSTANCE et HMODULE partagent le même typedef, l'aide dit que ce ne sont pas exactement les mêmes types, et que l'un des deux représente l'adresse de base d'un module dans la mémoire virtuelle du processus.

    Par contre, ils gardent la caractéristique principale de tout handle: L'unicité dans un processus: deux modules ne peuvent pas avoir le même HINSTANCE/HMODULE dans le même processus (il dans le cas présent, il est possible que cette unicité soit réciproque).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    ouais, moi handles, hinstances et modules je fais pas trop la différence...
    mais merci quand même pour ta petite explication !

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Médinoc
    Ce n'est pas un "Vrai" handle, et ce n'est certainement pas un HANDLE (le type HANDLE étant pour moi réservé aux objets Kernel).

    [...]
    Que de détails !
    Mon propos n'était pas de dire que c'était un "vrai handle (<- nom commun en minuscules, pas typedef en majuscules) pur jus 100% sans impuretés", juste que c'était un handle d'après la doc. de MS.
    Citation Envoyé par [url]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/dllmain.asp[/url]
    BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,
    DWORD fdwReason,
    LPVOID lpvReserved
    );

    Parameters

    hinstDLL
    [in] Handle to the DLL module.
    <shamelessPlug>Sinon, si tu aimes donner des détails, je suis preneur de détails sur les fonctions de samsrv.dll</shamelessPlug>
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    A l'origine c'était un Handle (Win 3x). Mais en prog 32 bits il n'a plus de sens. Il est là pour compatibilité ascendante.
    Note que les handles GDI et User sont eux aussi des vrais handles.

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Comment reconnaît-on un "vrai" handle d'un faux ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En l'occurence, un "vrai" handle est plus ou moins supposé n'être rien d'autre qu'un descripteur/ID/etc (mais c'est flou, bien sûr).

    Les handles des objets Kernel (HANDLE) sont typiquement des descripteurs (pour être précis, c'est le niveau en-dessous). Il me semble qu'il en est de même pour les objets USER (globaux) et GDI (locaux à un processus, bien qu'accessibles sous un ancien Windows).

    Le HINSTANCE/HMODULE portant une information supplémentaire (adresse de base du module), on peut les considérer comme autre chose que des "vrais" handles (bien que je reconnaisse que c'était pompeux de ma part de dire cela).

    Mais rétrospectivement, je me dis que cette "limite" est trop floue pour qu'on puisse vraiment dire qu'il y en a une: De quels types sont les handles de la CryptoAPI ? Spécialement le plus extérieur (HCRYPTPROV) qui est peut-être en vérité un pointeur opaque...
    Sans compter les HGLOBAL/HLOCAL, qui ne sont visiblement pas des handles Kernel puisqu'ils ne sont pas duplicables par DuplicateHandle(), mais qui sont marshallés par le DDE...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Ok.
    D'une certaine façon, cela dépend comment on le regarde.
    Pour faire un parallèle (douteux?), pour toi le numéro national d'identité ne serait pas un "vrai" handle et le numéro d'une plaque d'immatriculation sans numéro de département en serait un, c'est bien ça ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  14. #14
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Le principe des handle, c'est un idiome de programmation qu'on retrouve ailleurs qu'en Win32. Un handle, c'est un identifiant opaque, qui identifie quelque chose. HINSTANCE : handle sur une instance ? kesako ?
    Et sa valeur n'est pas opaque du tout (adresse du process mappé en mémoire), donc c'est pas un handle.
    En Win32, on ne prend traditionnellement en compte que 3 types de handle : noyau, user, GDI, issus de 3 "bibliothèques" différentes. Mais pour le reste (CryptoAPI, Wininet, Heap...), le terme de handle me semble tout à fait correct. Ce sont des handles propres à une lib, alors que les précédents sont gérés par l'OS. Mais ils sont distincts : un handle kernel n'a rien à voir un handle GDI, et il convient d'utiliser les fonctions adaptées (CloseHandle/DeleteObject, ...).
    Bref, tout ça pour dire qu'il y a très peu de "faux" handle.

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Le principe des handle, c'est un idiome de programmation qu'on retrouve ailleurs qu'en Win32. Un handle, c'est un identifiant opaque, qui identifie quelque chose. HINSTANCE : handle sur une instance ? kesako ?
    Et sa valeur n'est pas opaque du tout (adresse du process mappé en mémoire), donc c'est pas un handle.
    [...]
    La valeur d'un HINSTANCE n'est pas opaque quand tu te préoccupes de ce qu'il y a dedans. Si tu ne t'en soucies jamais, et c'est possible, cela sera - de ton point de vue - un handle, mais pas dans l'absolu. D'où ma phrase précédente : "D'une certaine façon, cela dépend comment on le regarde".
    Je ne sais pas si je suis plus clair cette fois...???...

    Bref, je crois que nous sommes vaguement d'accord mais que nous ne voyons pas forcément les choses sous le même angle...

    Quelqu'un veut ajouter quelque-chose ? (à part un lien vers un article de Wikipedia)
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  16. #16
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Je n'ai pas cherché à contester tes propos, je pense comme tu dis qu'on est d'accord. Le principe du handle c'est que tu n'as pas à te soucier de sa valeur (à part NULL/INVALID etc...) car elle n'est pas censé avoir de signification pour toi = le client de la bibliothèque.
    Dans le cas de HINSTANCE:
    http://msdn.microsoft.com/library/en...se/dllmain.asp
    hinstDLL
    [in] Handle to the DLL module. The value is the base address of the DLL. The HINSTANCE of a DLL is the same as the HMODULE of the DLL, so hinstDLL can be used in calls to functions that require a module handle.
    la valeur du "handle" n'est pas opaque, elle est documentée comme ayant une signification. C'est ce qui en fait, à mon avis, un faux handle, car à la base le handle est là pour dissimuler une structure interne privée. Et là, il n'y a aucune structure cachée rattachée à ce handle. Donc, HINSTANCE/HMODULE, ce sont simplement des pointeurs.

    Ils ont laissé en l'état à cause de l'aspect historique de la chose. C'est comme WPARAM, qui n'est plus un WORD depuis longtemps, mais qui s'appelle toujours WPARAM.

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet, le WPARAM est maintenant un UINT_PTR (et le LPARAM un LONG_PTR).
    Pourtant, hélas, on trouve encore des gens qui apprennent à programmer avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LONG FAR PASCAL WindowProc(HWND, WORD, WORD, LONG);
    Je le sais, mon vieux prof de système m'a appris ça en 2001...
    Difficile d'utiliser HIWORD(wParam) avec ça...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Je n'ai pas cherché à contester tes propos
    <dialogueDeSourds>Je n'ai jamais dit que tu contestais mes propos.</dialogueDeSourds>
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  19. #19
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Médinoc
    Je le sais, mon vieux prof de système m'a appris ça en 2001...
    Estime toi heureux d'avoir eu une initiation à Win32/Win16 à l'école.

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ah, non, pas à l'école!
    Dans mon école d'ingé, on n'a eu droit qu'à du mode console sur un très vieil unix (le gcc installé ne reconnait même pas -Wextra), et un peu de java Swing.

    Ma formation Windows, je l'ai eu en BTS II (dernière année avant que ça ne devienne IRIS) et en fait, j'ai appris les sockets sous Windows.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/02/2013, 13h20
  2. Comment une classe peut se centrer d'elle meme ?
    Par babbu dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 24/09/2008, 09h31
  3. Réponses: 2
    Dernier message: 05/09/2006, 10h08
  4. [C#] Comment une thread peut-elle attendre un evenement?
    Par legillou dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/07/2006, 15h58
  5. une Dll peut elle utiliser les fonctions d'une autre dll?
    Par kantelise dans le forum Windows
    Réponses: 7
    Dernier message: 18/05/2006, 03h45

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