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 :

Récupérer nom DLL


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 Récupérer nom DLL
    Bonjour,

    J'ai écris des DLL ISAPI et j'ai besoin de récupérer dans mon code, le nom de ma DLL, comme on peut le faire avec application.exename.

    J'ai tenté avec GetModuleFileName, mais comme le dit l'aide, c'est pas du 100% et là c'est le cas, car je ne récupère que '\\?'...
    La Dll étant lancée via IIS par w3pw, je pense que c'est l'explication de ce retour relativement vide.

    Bref, l'objectif étant de ne pas être obligé de le noter en dur dans mon code et me permettre d'aller charger au démarrage de la lib un INI en fonction de son nom.

    Il est bien entendu, que c'est à partir de ma DLL que j'ai besoin d'en extraire le nom, (avec ou sans extension, avec ou sans chemin).

    Je pourrais donc récupérer le nom qui se trouve dans la source du projet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Library MyLib;
     ....
    Mais je n'y arrive pas...

    Avez vous une idée ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 764
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    Je n'ai jamais entendu dire qu'il y avait des problèmes avec cette procédure comme je n'ai jamais entendu parler de /proc
    Si on regarde l'aide sur GetModuleName (une encapsulation de GetModuleFileName) l'avertissement est spécifique à Mac OS.

    Peut-être nous montrer comment tu alloues le buffer...

  3. #3
    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 Andnotor Voir le message
    Je n'ai jamais entendu dire qu'il y avait des problèmes avec cette procédure comme je n'ai jamais entendu parler de /proc
    Si on regarde l'aide sur GetModuleName (une encapsulation de GetModuleFileName) l'avertissement est spécifique à Mac OS.

    Peut-être nous montrer comment tu alloues le buffer...
    Tu as raison, pour GetmoduleName, l'aide indique que la mise en garde est spécifique à MacOs, mais dans mon aide X2, il ne le précise pas pour GetmoduleFileName.

    J'utilise la déclaration GetmoduleFileName de l'unité Winapi.Windows et non GetModuleName qui encapsule Winapi.Windows.GetmoduleFliename ...
    Donc ça revient au même sans utiliser l'encapsulation.

    Quant a ma déclaration, elle est tout à fait standard et depuis 18 ans que j'utilise Delphi, je n'ai jamais eut ce cas de figure, on apprend tous les jours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      sz:= StrAlloc(max_path);
         try
            i:= GetmoduleName(hinstance, sz, sizeof(sz));
            savetrace(format('Nom dll %s %d',[strpas(sz), i]));
         finally
                strdispose(sz);
         end;
    J'ai donc changé ma déclaration en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     var
     
       sz: array[0..MAX_PATH] of Char;
       i: integer;
     begin
            i:= GetmodulefileName(Hinstance, sz, sizeof(sz));
            savetrace(format('Nom dll %s %d',[extractfilename(string(sz)), i]));
    Et là ça passe...

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 764
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    C'est la transcription Delphi de StrAlloc en widechar qui est complètement foireuse
    Ce div 2 n'a aucune raison d'être (bonjour le commentaire) puisque la taille de la chaîne va être interprétée à pointeur-6 (et non -4)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function WideStrAlloc(Size: Cardinal): PWideChar;
    begin
      //BJK: Size should probably be char count, not bytes; but at least 'div 2' below prevents overrun.
      Size := Size * SizeOf(WideChar);
      Inc(Size, SizeOf(Cardinal));
      GetMem(Result, Size);
      Cardinal(Pointer(Result)^) := Size;
      Inc(Result, SizeOf(Cardinal) div 2);
    end;
     
    function StrAlloc(Size: Cardinal): PChar;
    begin
      Result := WideStrAlloc(Size);
    end;
    Et StrDispose est du même tonneau et encore pire dans le sens où le premier word de la chaîne (le premier caractère) fait partie du dword de la taille (!), que la taille est en widechar et non en byte (!) et que le tout premier word ne sera pas libéré (celui à pointeur-4)
    (Vous avez dit MemoryLeak )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure StrDispose(Str: PWideChar);
    begin
      if Str <> nil then
      begin
        Dec(Str, SizeOf(Cardinal) div 2);
        FreeMem(Str, Cardinal(Pointer(Str)^));
      end;
    end;
    J'espère que ce gars n'est plus chez Embarcadero...

    @castorcharly: En résumé, ton code n'était pas en cause et fonctionnait bien il y a 18 ans... en ANSI

  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
    Si je n'avais pas été trompé par l'avertissement sur getmodulefilename, qui n'a donc pas de rapport avec un OS Windows, j'aurai cherché dans mon code et les sources...

    Mais bon, tu m'as remis sur les rails et on sait qu'il y a des bugs, je l'avais occulté... je suis trop crédule

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

Discussions similaires

  1. Comment récupérer nom de domaine pris chez Lycos ?
    Par cortex024 dans le forum Domaines
    Réponses: 7
    Dernier message: 21/07/2009, 11h01
  2. récupérer nom de champs et type de champs
    Par jexl dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/03/2006, 13h49
  3. Réponses: 12
    Dernier message: 02/03/2006, 14h13
  4. [ADO.Net][C# 2.0]Comment récupérer nom colonne PrimaryKey?
    Par superbobo dans le forum Accès aux données
    Réponses: 1
    Dernier message: 18/01/2006, 17h34
  5. [ActionEvent] Récupérer nom du composant émetteur
    Par mouloude dans le forum Composants
    Réponses: 4
    Dernier message: 29/10/2004, 17h19

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