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

Delphi Discussion :

problème GetModuleName sous linux


Sujet :

Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut problème GetModuleName sous linux
    Bonjour

    je viens de galérer un moment avec un dev sous linux a cause du comportement de GetModuleName
    GetModuleName semble ajouter un #0 dans la chaine de retour
    si on lit un fichier ou on enregistre le résultat de GetModuleName en ajoutant .fblog cela donne la chose suivante
    /^@f^@b^@t^@e^@s^@t^@f^@b^@l^@o^@g^@l^@i^@n^@u^@x^@^@^@.^@f^@b^@l^@o^@g^@"^@^M^@
    il y a ^@^@ entre le nom du module name '/fbtestfbloglinux' et le '.fblog' que j'ajoute
    le code qui génère le soucis est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strTemp := GetModuleName(0)+ '.fblog';
    Cela forcement pose des soucis lorsque je cherche a générer ou accéder a un fichier
    Mais cela plante l'IDE si je fait un Writeln du resultat
    pour contourner le soucis j'utilise ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        strTemp := GetModuleName(0) ;
        SetLength(strTemp,length(strtemp)-1);
        strTemp := strTemp + '.fblog';
    est ce un bug ou faut il éviter d'utiliser GetModuleName sous Linux ?
    Embarcadero® RAD Studio 10.4 Version 27.0.38860.1461

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 054
    Points : 40 995
    Points
    40 995
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    GetModuleName(0) je ne connaissais pas, il est d'ailleurs indiqué que
    Avertissement : Sous MAC OS, GetModuleName ne réussit pas toujours.
    c'est peut-être le cas pour d'autres OS.
    D'autre part, les résultat est peut-être aussi dû à un encodage particulier ?

    est ce un bug ou faut il éviter d'utiliser GetModuleName sous Linux ?
    AMHA c'est un bug, cette fonction appelle GetModuleFilename qui est un appel à une API windows , pourtant pas de directives de compilation {$IFDEF WINDOWS} mais je n'ai peut-être pas assez fouillé dans le source.

    J'aurais simplement utilisé paramstr(0) qui lui semble fonctionner dans tous les OS.
    Néanmoins pour du multiplateforme j'aurais utilisé l'unité IOUtils.Tpath et obtenu un répertoire particulier (pas forcément celui de l'application, souvent protégé)
    ce tableau en donne une liste précise
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Bonjour SergioMaster

    merci pour ta réponse
    surtout le lien vers le tableau de IOUtils.Tpath
    je vais regarder çà

  4. #4
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    J'sais pas si c'est officiellement fonctionnel, mais si tu as un programme d'exemple n'hésite pas à ouvrir un ticket d'incident. Au pire ils répondront qu'il n'est pas pris en charge pour le moment.

    Pour le #0 c'est sans doute parce que Linux a historiquement des chaines en ASCIIZ. Ca aussi, si tu as un programme d'expie, tu peux le faire remonter parce qu'à mon avis c'est passé à la trappe dans certains modules de l'OS. (après ça dépend aussi du type de chaine utilisé)

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Bonsoir
    @pprem : ticket ouvert RSP-32373
    @SergioMaster : si je vais dans le répertoire contenant le programme et que je l’exécute paramstr(0) me renvoie que le nom du programme
    contrairement à GetModulename(0) qui lui me renvoie le chemin complet peu importe comment est exécuté le programme

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 054
    Points : 40 995
    Points
    40 995
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par fbalien Voir le message
    @SergioMaster : si je vais dans le répertoire contenant le programme et que je l’exécute paramstr(0) me renvoie que le nom du programme
    contrairement à GetModulename(0) qui lui me renvoie le chemin complet peu importe comment est exécuté le programme
    Il va falloir que je prenne le temps d'essayer autrement que sur une machine virtuelle (wsl)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Merci pour le RSP

    Citation Envoyé par fbalien Voir le message
    si je vais dans le répertoire contenant le programme et que je l’exécute paramstr(0) me renvoie que le nom du programme
    Me souvenais plus de cet effet de bord, mais effectivement, ce sont les morceaux de la ligne de commande, donc c'est logique.

    Il y a des chances que System.IOUtils.TDirectory.GetCurrentDirectory ne soit pas non plus d'une grande aide si le programme a été lancé d'ailleurs.

    Par contre tu as peut-être une chance avec System.IOUtils.TPath.GetFullPath sur paramstr(0) qui devrait recalculer le chemin du programme.

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 054
    Points : 40 995
    Points
    40 995
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Il va falloir que je prenne le temps d'essayer autrement que sur une machine virtuelle (wsl)
    voilà, c'est fait
    Nom : Capture.PNG
Affichages : 109
Taille : 85,0 Ko
    finalement getmodulename serait mieux.
    Toutefois, un fichier log, je le mettrais dans les documents de l'utilisateur, pas où se trouve le programme

    Il y aurait donc un problème en mode console et non s'il s'agit d'un programme GUI ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Il y aurait donc un problème en mode console et non s'il s'agit d'un programme GUI ?
    L'interface graphique fait un équivalent du ShellExecute() et passe donc le chemin complet du fichier sur lequel on clique à l'interpréter de commande. ça passe de la même façon sous Windows.

    En ligne de commande directe on n'a pas cette contrainte : appels en absolu, en relatif ou directement l'"exe"

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 054
    Points : 40 995
    Points
    40 995
    Billets dans le blog
    62
    Par défaut
    lancé depuis le terminal j'ai quand même
    Paramstr0 ./Project110
    getmodule /home/serge/PAServer/scratch-dir/serge-WSL/Project110/Project110
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Bonjour

    merci pour ce temps passé a tester
    j'ai trouvé la cause du dysfonctionnement
    c'est le fait que j'ai un ç dans le chemin du programme
    en échangeant avec le support qui n'a pas réussi à reproduire le problème
    je me suis souvenu d'un autre case ouvert pour un soucis de point d'arrêt qui ne fonctionne pas en windows 64bits sur mon pc perso mais qui fonctionne sur celui du taf
    hors chez moi le user c'est françois donc il y a un ç dans le chemin du compilateur
    j'ai fait quelques test sur ma vm linux
    avec le code suivant
    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
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
    System.SysUtils,
    system.classes;
     
    var
    fichier : TStreamWriter;
    strTemp : string;
     
    begin
    try
    { TODO -oUser -cConsole Main : Insérer du code ici }
     
    fichier := TStreamWriter.Create('/tmp/test.txt',true);
    strTemp := 'dd' + GetModuleName(0) + 'dd' +#10;
    fichier.Write(strTemp );
    strTemp := 'dd' + ParamStr(0) + 'dd' +#10;
    fichier.Write(strTemp );
    fichier.Free;
    except
    on E: Exception do
    Writeln(E.ClassName, ': ', E.Message);
    end;
    end.
    1- dans le répertoire par défaut /usr/bin/PAServer-21.0/scratch-dir/françois-ordinateur003/Project1/
    résultats
    Getmodulename : dd/usr/bin/PAServer-21.0/scratch-dir/françois-ordinateur003/Project1/Project1^@dd
    Paramstr : dd/usr/bin/PAServer-21.0/scratch-dir/françois-ordinateur003/Project1/Project1dd

    2- /root/françois/
    résultats
    Getmodulename : dd/root/françois/Project1^@dd
    Paramstr : dd/root/françois/Project1dd

    3- /root/
    résultats
    Getmodulename : dd/root/Project1dd
    Paramstr : dd/root/Project1dd

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

Discussions similaires

  1. [LabView 8.5] Problème VI sous Linux
    Par nuFox dans le forum LabVIEW
    Réponses: 1
    Dernier message: 18/03/2008, 18h59
  2. Problème MySQL sous Linux
    Par Feysal dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 07/08/2007, 16h46
  3. Problème exec sous Linux
    Par jaggy19 dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2007, 14h13
  4. problème éxécution sous linux
    Par madmox dans le forum Général Java
    Réponses: 4
    Dernier message: 30/05/2007, 19h14
  5. Problème oracle10g sous linux debian
    Par man84 dans le forum Debian
    Réponses: 2
    Dernier message: 12/12/2006, 11h36

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