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 :

Chemin complet (sans suspension) de l'application


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut Chemin complet (sans suspension) de l'application
    Salut!
    Le titre donne un air de déjà vu mais je n'ai pourtant rencontré cette problématique nulle part (je n'ai peut-être pas bien fouillé ).

    Le problème est le suivant :
    Application.ExeName tout comme ParamStr(0) renvoie le chemin complet de l'exécutable de l'application. Seulement, quand ce chemin est long, une partie est remplacée par "..." (sous Windows en tout cas). Du coup, on n'a plus un chemin qui existe

    En effet, il est possible de trouver
    "C:\Users\XXXXX\Desktop\dossier1\dossier2\dossier3\dossier4\dossier5\"
    mais pas
    "C:\Users\XXXXX\Desktop\dos...\dossier4\dossier5\"
    (c'est ce que j'ai cru comprendre en tout cas)

    Maintenant la question :
    Y aurait-il un moyen de récupérer le chemin (non coupé ) de l'application?

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Connaitre la version de l'OS et de delphi serait bien.

    Sinon j'ai des chemins largement plus long que cela parfois et je n'ai jamais rencontré de soucis comme ça avec application.exename ou Paramstr(0).

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut
    Je suis avec Windows8 et Delphi XE

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Alors je n'ai jamais utilisé Delphi XE avec Windows 8 mais avec les autres versions de Windows (Seven en particulier) je n'ai jamais eu le problème que tu as rencontré.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut
    Je précise que cela se produit quand le chemin est long (j'avoue que j'ai pas vérifié la longueur). En changeant de dossier, le chemin s'affiche en entier quand il s'agit d'un dossier pas trop profond.
    Vu que ParamStr(0) est de type String (qui est par défaut à UnicodeString qui a 2^30 caractères si je ne m'abuse), le chemin aussi long soit-il devrait pouvoir y entrer. Je me trompe peut-être ...

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    De plus Application.ExeName et ParamStr(0) c'est le même chose sachant que ExeName utilise ParamStr(0)

    Sinon en regardant le code de ParamStr

    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
     
    function ParamStr(Index: Integer): string;
    {$IFDEF MSWINDOWS}
    var
      P: PChar;
      Buffer: array[0..260] of Char;
    begin
      Result := '';
      if Index = 0 then
        SetString(Result, Buffer, GetModuleFileName(0, Buffer, Length(Buffer)))
      else
      begin
        P := GetCommandLine;
        while True do
        begin
          P := GetParamStr(P, Result);
          if (Index = 0) or (Result = '') then Break;
          Dec(Index);
        end;
      end;
    Il semblerait que le problème vienne de GetModuleFileName

    Citation Envoyé par Aide Delphi
    Renvoie le nom complet d'un module, à partir de son handle.

    Appelez GetModuleFileName pour obtenir le nom complet d'un module, à partir de son handle. La version GetModuleFileName définie dans l'unité System est disponible uniquement sous Linux. Sous Windows, utilisez l'API Windows de même nom à la place.

    Module est le handle du module dont le nom de fichier est requis.

    Buffer est un tampon qui reçoit le nom de fichier.

    BufLen représente le nombre d'octets dans Buffer.

    GetModuleFileName renvoie le nombre d'octets écrits dans Buffer.


    Avertissement : GetModuleFileName ne réussit pas toujours. Selon la façon dont l'application est appelée, la présence du système de fichiers /proc et d'autres facteurs, il peut arriver que GetModuleFileName renvoie un nom incomplet ou, dans certains cas, qu'elle ne renvoie aucun nom de fichier. Pensez à vérifier les résultats de cette fonction avant d'utiliser la valeur renvoyée.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut
    En effet, on dirait bien que ça vient de GetModuleFileName. Je pense à écrire une fonction pour récupérer le nom complet.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut
    La méthode proposée par ShaiLeTroll dans cette discussion me ramène un texte en ... chinois !!!

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 755
    Points : 13 349
    Points
    13 349
    Par défaut
    La "problématique" correspond à un label avec sa propriété EllipsisPosition réglée sur epPathEllipsis. Mais ce n'est qu'une question d'affichage et ne modifie en rien le contenu de Caption.

    On obtient le même résultat ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DrawText(Canvas.Handle, PChar(s), -1, Rect, DT_PATH_ELLIPSIS);
    //ou
    Canvas.TextRect(Rect, s, [tfPathEllipsis]);

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut

    J'ai rien compris Andnotor.
    T'es sûr que la réponse portait sur cette discussion?

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut
    Une chose plutôt étrange c'est produite ce matin :
    Mon ExtractFileDir(Application.ExeName) rérupère effectivement tout le chemin du dossier de mon application
    Je ne sais vraiment pas ce qui a changé entre hier et aujourd'hui.
    Mais il y a tout de même un petit truc : le ShowMessage affiche toujours avec les pointillés, même si le chemin est pris entièrement.

    A tout hasard, j'ai écrit une fonction pour récupérer le chemin complet d'un fichier :
    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
    function TProcedures.GetApplicationFullPath(filePath : string) : AnsiString;
    var chemin  : string;
        dirPath: string;
        racine 	: string;
        dossier : string;
    begin
      Result := '';
      chemin := filePath;
      racine := ExtractFileDrive(chemin);
     
      repeat
        dirPath := ExtractFileDir(ExcludeTrailingPathDelimiter(chemin));
        dossier := ExtractFileName(dirPath);
        Result := dossier + PathDelim + Result;
        chemin := dirPath;
      until dossier = '';
     
      Result := racine + Result;
    C'est un peu tiré par les cheveux je l'avoue mais ça marchais hier soir, 22h

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    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 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Utilise plutôt OutputDebugString pour le débogage, ce n'est pas bloquant, cela s'affiche dans le journal d'évènemenet (CTRL + ALTR + V) et il n'y a pas d'altération d'affichage
    Je crois que ODS est toujours limité à 255 caractères, à savoir que MAX_PATH c'est 260 (255 pour le chemin, 4 pour ext et zéro terminal)

    passe UseLatestCommonDialogs à False, cela change-t-il l'aspect du ShowMessage ainsi que son contenu

    C'est ce qu'évoque Andnotor, possible que l'affichage modifie la chaine en interne pour une raison de taille maximale (nombre de caractères, WordWrap mais pas d'espace pour faire un retour charriot, nombre de pixel ...)
    d'ailleurs l'API qui fait se travail c'est en réalité PathCompactPath

    Pour le Chinois, as-tu respecté AnsiString et GetModuleFileNameA ?
    Je pense que tu as mélanger du Ansi et Unicode
    Pense àvérifier le retour de GetModuleFileNameA qui a échoué à cause d'un buffer trop petit indiqué par ERROR_INSUFFICIENT_BUFFER

    Citation Envoyé par MSDN
    The Windows API has many functions that also have Unicode versions to permit an extended-length path for a maximum total path length of 32,767 characters. This type of path is composed of components separated by backslashes, each up to the value returned in the lpMaximumComponentLength parameter of the GetVolumeInformation function (this value is commonly 255 characters). To specify an extended-length path, use the "\\?\" prefix. For example, "\\?\D:\very long path".

    Ensuite est-ce que "C:\Users\XXXXX\Desktop\dos...\dossier4\dossier5\";
    est une version courte de "C:\Users\XXXXX\Desktop\dossier1\dossier2\dossier3\dossier4\dossier5\";
    au même titre que "C:\Users\XXXXX\Desktop\dos~1\dossier4\dossier5\" comme sous DOS

    Voir si PathSearchAndQualify permet de retrouver ce qu'il faut !

    Si tu as changement réel de comportement de ParamStr(0), peut-être que tu as crée un nouveau dossier sur Destkop qui rend "dos..." ambigu qui sous DOS aurait été résolu en "dos~1" et "dos~2" d'où le retour d'un chemin complet

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/04/2011, 02h51
  2. Comment récupérer le chemin complet SANS le nom de la page HTML ?
    Par Zebulon777 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/09/2010, 11h17
  3. [XL-2003] Splitter le chemin complet d'un fichier. Chemin sans le nom et nom
    Par djoumusic dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/02/2010, 19h12
  4. ouvrir un ficher sans connaître son chemin complet
    Par laurent_m dans le forum Documents
    Réponses: 1
    Dernier message: 13/08/2009, 04h32
  5. Réponses: 2
    Dernier message: 02/05/2008, 11h38

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