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

Lazarus Pascal Discussion :

Lecture de clé de registre et problème de concaténation [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 15
    Par défaut Lecture de clé de registre et problème de concaténation
    Bonjour développeurs,

    J'utilise Windows 7, Lazarus version 1.0.12, FPC 2.6.2 et SVN 42478.
    Je travaille depuis plusieurs semaines sur un programme et j'ai découvert un problème, lorsque vient le temps de lire une clé de registre.

    Voici la portion du code qui me cause problème :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
       Forms, LCLType, Registry, ShellApi, ComCtrls, StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    // Execute FSX.exe
    procedure TForm1.Button1Click(Sender: TObject);
    var
      reg: TRegistry;
      str: string;
      exeFSX : string;
    begin                        // Allons chercher le chemin de FSX.exe
      reg := TRegistry.Create;
      reg.RootKey := HKEY_CURRENT_USER;
      reg.OpenKeyreadonly('Software\Microsoft\Microsoft Games\Flight Simulator\10.0');
      str := reg.ReadString('AppPath');
      reg.closekey;
      reg.free;
     
      exeFSX := (str + 'FSX.exe');
     
      // Executer FSX.exe  si retourne > 32 c'est qu'il y a erreur
      if ShellExecute(0,nil, PChar(exeFSX),nil,nil,SW_SHOWNORMAL) > 32 then
        begin
          Halt();
        end
      else
        Application.MessageBox('Unable to find FSX.exe!', 'Run FSX.exe', MB_ICONINFORMATION);
    end;
    end.
    Lorsque je fais appel à cette clé de registre en particulier, la concaténation de cette ligne de code ne fonctionne plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      exeFSX := (str + 'FSX.exe');
    Cela fait une bonne semaine que je cherche à solutionner ce problème, mais sans succès.

    Avez-vous déjà rencontré ce genre de situation ?
    Est-ce un bogue avec Lazarus ?

    Merci de votre support.

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 126
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Salut,
    Citation Envoyé par MikeEagle Voir le message
    (...) Lorsque je fais appel à cette clé de registre en particulier, la concaténation de cette ligne de code ne fonctionne plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      exeFSX := (str + 'FSX.exe');
    Déjà tu aurais pu nous dire ce que vaut ta variable "exeFSX", avec un bête ShowMessage par exemple.

    Ensuite, est-ce que ça ne serait pas tout simplement un petit oubli ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      exeFSX := str + '\'  + 'FSX.exe';
    Mais sans l'info du ShowMessage, c'est un peu impossible de deviner...

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 15
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Salut,


    Déjà tu aurais pu nous dire ce que vaut ta variable "exeFSX", avec un bête ShowMessage par exemple.

    Ensuite, est-ce que ça ne serait pas tout simplement un petit oubli ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      exeFSX := str + '\'  + 'FSX.exe';
    Mais sans l'info du ShowMessage, c'est un peu impossible de deviner...

    Salut,

    Voici plus d'information:
    La valeur retournée par str := reg.ReadString('AppPath'); est le chemin d'accès et le résultat est bon et c'est

    F:\Microsoft Flight Simulator X\

    Je fait tout simplement ajouter FSX.exe à cette chaine de caractère ce qui devrait me donner pour exeFSX (F:\Microsoft Flight Simulator X\FSX.exe).
    Sauf que pour une raison que je n'arrive pas à m'expliquer la concaténation ne fonctionne pas et le résultat est F:\Microsoft Flight Simulator X\

    Je commence à croire que c'est un petit bug!

    J'espère que ça pourra aider.

    Merci.

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 126
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Citation Envoyé par MikeEagle Voir le message
    Je fais tout simplement ajouter FSX.exe à cette chaine de caractère ce qui devrait me donner pour exeFSX (F:\Microsoft Flight Simulator X\FSX.exe).
    As-tu mis un ShowMessage comme je te l'ai suggéré ?
    Citation Envoyé par MikeEagle Voir le message
    Sauf que pour une raison que je n'arrive pas à m'expliquer la concaténation ne fonctionne pas et le résultat est F:\Microsoft Flight Simulator X\
    Le résultat de quoi ?
    As-tu mis un ShowMessage comme je te l'ai suggéré ?

    Citation Envoyé par MikeEagle Voir le message
    Je commence à croire que c'est un petit bug !
    Et moi je crois que puisque ta chaîne contient des espaces, c'est la fonction ShellExecute qui s'embrouille, à cause de ces espaces.
    Peut-être qu'avec un exeFSX := '"' + str + 'FSX.exe' + '"'; ça devrait aller mieux.

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    ou des #0 dans str ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 15
    Par défaut
    Citation Envoyé par Jipété Voir le message
    As-tu mis un ShowMessage comme je te l'ai suggéré ?

    Le résultat de quoi ?
    As-tu mis un ShowMessage comme je te l'ai suggéré ?



    Et moi je crois que puisque ta chaîne contient des espaces, c'est la fonction ShellExecute qui s'embrouille, à cause de ces espaces.
    Peut-être qu'avec un exeFSX := '"' + str + 'FSX.exe' + '"'; ça devrait aller mieux.
    Les informations concernant les résultats proviennents des ShowMessage.
    Je ne peut malheureusement pas mettre de capture d'écran.
    Je vais mettre des commentaires dans le code qui représente les résultats

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
       Forms, LCLType, Registry, ShellApi, ComCtrls, StdCtrls, Dialogs;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    // Execute FSX.exe
    procedure TForm1.Button1Click(Sender: TObject);
    var
      reg: TRegistry;
      str: string;
      exeFSX : string;
    begin                        // Allons chercher le chemin de FSX.exe
      reg := TRegistry.Create;
      reg.RootKey := HKEY_CURRENT_USER;
      reg.OpenKeyreadonly('Software\Microsoft\Microsoft Games\Flight Simulator\10.0');
      str := reg.ReadString('AppPath');
      reg.closekey;
      reg.free;
     
      ShowMessage('str = ' + str);    // Résultat donne  str = F:\Microsoft Flight Simulator X\
     
      exeFSX := '"' + str + 'FSX.exe' + '"';   //  ou exeFSX := (str + 'FSX.exe'); donne le même résultat
     
      ShowMessage('str + FSX.exe = ' + exeFSX); // Résultat donne  str + FSX.exe = F:\Microsoft Flight Simulator X\
     
      // Executer FSX.exe  si retourne > 32 c'est qu'il y a erreur
      if ShellExecute(0,nil, PChar(exeFSX),nil,nil,SW_SHOWNORMAL) > 32 then
        begin
          Halt();
        end
      else
        Application.MessageBox('Unable to find FSX.exe!', 'Run FSX.exe', MB_ICONINFORMATION);
    end;
    end.

    Par contre, la concaténation fonctionne très bien si je mets en commentaire la partie qui traite le régistre et j'assigne une valeure à str.
    Voila le code
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
       Forms, LCLType, Registry, ShellApi, ComCtrls, StdCtrls, Dialogs;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    // Execute FSX.exe
    procedure TForm1.Button1Click(Sender: TObject);
    var
      reg: TRegistry;
      str: string;
      exeFSX : string;
    begin                        // Allons chercher le chemin de FSX.exe
    {
      reg := TRegistry.Create;
      reg.RootKey := HKEY_CURRENT_USER;
      reg.OpenKeyreadonly('Software\Microsoft\Microsoft Games\Flight Simulator\10.0');
      str := reg.ReadString('AppPath');
      reg.closekey;
      reg.free;
    }
     
      str := 'F:\Microsoft Flight Simulator X\';
      ShowMessage('str = ' + str);    // Résultat donne  str = F:\Microsoft Flight Simulator X\
     
      exeFSX := (str + 'FSX.exe');
     
      ShowMessage('str + FSX.exe = ' + exeFSX); // Résultat donne  str + FSX.exe = F:\Microsoft Flight Simulator X\FSX.exe
     
      // Executer FSX.exe  si retourne > 32 c'est qu'il y a erreur
      if ShellExecute(0,nil, PChar(exeFSX),nil,nil,SW_SHOWNORMAL) > 32 then
        begin
          Halt();
        end
      else
        Application.MessageBox('Unable to find FSX.exe!', 'Run FSX.exe', MB_ICONINFORMATION);
    end;
    end.
    Merci.

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Que donne Length(str) ? Est-ce compatible avec le nombre de caractères affichés ? Varie-t-elle après la concaténation ? Le problème vient pê du transtypage en PChar pour le ShellExecute qui l'arrête au premier #0 ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

Discussions similaires

  1. [Débutant] Lecture de clé de registre d'un ordinateur distant
    Par Faufoll dans le forum VB.NET
    Réponses: 11
    Dernier message: 16/05/2014, 14h51
  2. probleme de lecture de DVD mais pas de problème pour les CD !
    Par littlepierre dans le forum Composants
    Réponses: 2
    Dernier message: 02/08/2009, 12h06
  3. Réponses: 0
    Dernier message: 27/04/2009, 16h27
  4. Réponses: 2
    Dernier message: 25/10/2007, 13h56
  5. Probleme de lecture de clés de registre
    Par Mac Twist dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2006, 19h00

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