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 :

Verifier une clé de registre dans une DLL [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Verifier une clé de registre dans une DLL
    Bonjour,

    Je débute en Free Pascal et j'utilise Lazarus pour coder.

    Voici mon problème, je souhaiterais que ma DLL s'assure qu'une clé crée avec l'installeur Inno Setup existe bien dans la base de registre.

    Voici le nom de ma clé :
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{5D957618-4ACD-4D14-B7FA-59286454CE15}_is1

    Ma Dll sert aussi à renvoyer des valeurs à un petit programme réalisé en C++.

    Donc ma première question est : est-ce compatible ou dois je faire appel à une DLL spécifique pour la vérification de la clé de registre ?

    Concernant la vérif, La logique serait :

    Lorsque mon appli fait appel à la DLL, celle-ci s'assure qu'il existe bien la clé de registre crée par l'installation.
    Si c'est le cas, elle exporte la valeur 1, si la clé de registre n'existe pas, elle exporte la valeur 0.
    Là, je cale, j'ai essayé pas mal de chose et fouillé Google mais j'ai toujours une erreur de syntaxe quelque part ou un problème de variable.

    Merci pour votre aide.
    Dave

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    A 1° lecture, je ne vois rien qui soit infaisable ni incompatible dans ce que vous dites...
    Les conventions d'appels (register, pascal, cdecl, stdcall et safecall) aux fonctions d'une dll peuvent se faire de différentes manières, ce qui influent sur le passage des paramètres et leur ordre de mise en place sur la pile...
    Elles doivent être définies dans Lazarus de façon à être compatible avec la dll.
    Je pense que c'est de là que viennent vos problèmes...
    Pourriez vous nous montrer la déclaration des fonctions que vous déclarez dans votre dll et comment vous les appeler depuis Lazazrus ?
    --
    Philippe.
    Philippe.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour Philippe,
    Merci pour votre réponse.

    Lorsque je parlais de compatibilité, c'était plutôt pour savoir s'il était possible d'intégrer cette vérification dans mon DLL existant sans que celà interfère avec le reste. Je suppose que oui mais comme je bloque pour l'instant, j'avais envisagé cette possibilité.

    Pour la convention d'appel, j'utilise stdcall. Mon code est sous cette forme. Il récupère les deux variables avec le numéro de version et le nom dans l'application et les renvois avec la forme voulu. Jusqu'ici tout va bien mais je souhaiterai que mon DLL s'assure qu'il a bien été installé avec un installeur et pas juste copier-coller dans mon dossier.

    C'est une petite application que je fais pour apprendre à coder et maitriser les dll Call.

    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
    library minimal;
     
    {$mode objfpc}{$H+}
     
    uses
      sysutils;
     
    function var1(var2: double; var3: PChar): PChar; stdcall;
    var
      sortie :ansistring; 
     
    begin
     
      sortie := 'Version ' + FloatToStr(x) + ' ' + y + '!';
     
     
      result := PChar(sortie);
    end;
     
    exports
      var1;
     
    begin
    end.
    Concernant la vérif, j'en suis là, dans le désordre. :
    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
    var 
      Registre: TRegistry; 
    begin 
      Registre := TRegistry.Create;
     
    Registre.RootKey := HKEY_LOCAL_MACHINE; 
     if Registre.ValueExists('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{5D957618-4ACD-4D14-B7FA-59286454CE15}_is1') 
      then
       ... // ma valeure doit être 1
    // Si elle n'existe pas, la valeure doit être 0
     
     
     
    Registre.CloseKey; 
    Registre.Free;
    end
    Voilà , celà doit vous sembler bien archaique et une aide serait bien appréciée.
    Par avance merci.
    David.

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Ceci devrait fonctionner (J'ai un peu modifié le code de la fonction d'appel au registre afin de la rendre plus "sure"...) :
    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
    library minimal;
     
    {$mode objfpc}{$H+}
     
    uses
      sysutils, registry;
     
    // Fonction de vérification de présence dans le registre
    function VerifieCleRegistre: Integer; stdcall;
    var
      Registre: TRegistry;
    begin
      Registre := TRegistry.Create;
      try
        Registre.RootKey := HKEY_LOCAL_MACHINE;
        if Registre.ValueExists('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{5D957618-4ACD-4D14-B7FA-59286454CE15}_is1') then
          // ma valeur doit être 1
          Result :=  1
        else
          // Si elle n'existe pas, la valeur doit être 0
          Result := 0;
        Registre.CloseKey;
      finally
        Registre.Free;
      end;
    end;
     
    // Fonction var1
    function var1(var2: Double; var3: PChar): PChar; stdcall;
    var
      sortie: AnsiString;
    begin
      sortie := 'Version ' + FloatToStr(var2) + ' ' + var3 + '!';
      // Allouer de la mémoire pour la chaine de résultat (taille de la chaine +1)
      Result := StrAlloc(Length(sortie) + 1);
      // Copier la Chaine
      StrPCopy(Result, sortie);
    end;
     
     
    exports
      VerifieCleRegistre,
      var1;
     
    begin
    end.
    Côte application, il faut déclarer les fonctions comme suit (cas d'une liaison statique entre exécutable et dll) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function VerifieCleRegistre: Integer; stdcall; external 'ma_dll.dll';
    function var1(var2: Double; var3: PChar): PChar; stdcall; external 'ma_dll.dll';
    Enfin, toujours éviter de passer des variables de type string entre dll et exécutable, surtout si la dll et l'exécutable n'ont pas été générés avec la même version du compilateur. Attention aussi aux fuites de mémoire suite à des allocations faites d'un côté et non libérées de l'autre...
    De préférence, l'appelant alloue la mémoire, la transmet à l'appelé qui la remplit, puis qui la restitue à l'appelant qui la libère...
    --
    Philippe.
    Philippe.

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour Philippe,

    Merci beaucoup beaucoup pour votre aide !!

    Effectivement, au delà du code, , j'ai eu pas mal de difficultés à récupérer la valeure dans mon appli. Après une partie de la soirée. J'ai enfin réussi ce matin !

    Merci encore.
    David.

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Encore moi, une petite précision, car j'avais fait l'erreur dans mon post.

    Il s'agit bien de if Registre.KeyExists et de non de if Registre.ValueExists.

    if Registre.KeyExists controle l'existence et if Registre.ValeurExists la valeure de la clé.

    Voilà, pour celui ou celle qui voudrait récupérer le code fourni par Philippe au dessus, il faut bien penser à changer celà.

    Merci encore.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  2. Réponses: 9
    Dernier message: 13/03/2008, 01h34
  3. insertion dans une table puis update dans une autre table
    Par uptoditime dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/10/2007, 18h08
  4. Recherche de valeur dans une feuille et affichage dans une autre
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/05/2007, 09h40
  5. Réponses: 3
    Dernier message: 06/09/2006, 09h06

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