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 :

[Lazarus] Chargement de librairie (DLL)


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut [Lazarus] Chargement de librairie (DLL)
    Bonjour,

    j'ai un programme que je migre vers Lazarus et qui charge dynamiquement une DLL. Le code dephi est celui-ci :

    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
     
    function LoadExtension(NameOfExt : String) : TProcExt ;
    var HandleProc : Integer ;
        proc : TProcExt ;
    begin
        HandleProc := LoadLibrary(PChar(NameOfExt + '.dll'));
     
        if HandleProc <> 0
        then
            @proc := GetProcAddress(HandleProc, 'Execute')
        else
            @proc := nil ;
     
        ListOfExtension.Add(NameOfExt, HandleProc, proc) ;
     
        Result := proc ;
    end ;
    Je l'ai convertie en ceci :
    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
    function LoadExtension(NameOfExt : String) : TProcExt ;
    var HandleProc : Integer ;
        proc : TProcExt ;
        tmp : String ;
        tmpPchar  : PChar ;
    begin
        tmp := NameOfExt + '.dll' ;
     
        { + 1 pour le \0 }
        SetLength(tmpPChar, Length(tmp) + 1) ;
     
        StrPCopy(tmpPChar, tmp) ;
     
        HandleProc := LoadLibrary(tmpPChar);
     
        if HandleProc <> 0
        then
            @proc := GetProcAddress(HandleProc, 'Execute')
        else
            @proc := nil ;
     
        ListOfExtension.Add(NameOfExt, HandleProc, proc) ;
     
        Result := proc ;
    end ;
    Sauf que ça fonctionne pas SetLength(tmpPChar, Length(tmp) + 1) ; il me dit que PChar est un objet constant.

    Mais FPC me dit sur les deux lignes où il y a @proc : xxxx.pas(183,9) Error: Can't assign values to an address

    J'ai chercher sur internet et j'ai trouvé ce code qui ne fonctionne pas :
    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
    // Validate registration data
    function CFLicTest(pstrRegSerial, pstrRegKey: String): Boolean;
     
    The function that calls confirm_registered looks like this:
    {*---------------------------
    * Validate registration data
    * pstrRegSerial - Serial, user / organization name prefixed by an identifier for the edition folowed by a - e.g. S-OrgName Inc
    * pstrKey - Registration key the user got after registering the product
    *---------------------------}
    function CFLicTest(pstrRegSerial, pstrRegKey: String): Boolean;
    var
    confirm_registered: Tconfirm_registered;
    ptrFunction: TFarProc;
    handleDLL: THandle;
    intLicValidate: Integer;
     
    begin
    try
    //
    // supApp.AppExe = application path
    // supApp.AppID = name of the application
    //
    handleDLL := LoadLibrary(PChar(supApp.AppExe + 'reg' + supApp.AppID + '.DLL'));
    ptrFunction := GetProcAddress(handleDLL, 'confirm_registered');
    if ptrFunction <> nil
    then begin
    @confirm_registered := ptrFunction;
    intLicValidate := confirm_registered(pstrRegSerial, pstrRegKey);
    end
    else begin
    intLicValidate := 0;
    end;
    except
    intLicValidate := 0;
    end;
    ptrFunction := nil;
    FreeLibrary(handleDLL);
    Result := Iff(intLicValidate = 0, false, true);
    end;
    Quelqu'un a-t-il déjà eu le problème ? Je ne trouve rien sur internet.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Je pense que tu peux reprendre le code Delphi en remplaçant le type TProcExt par Pointer :
    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
    function LoadExtension(NameOfExt : String) : Pointer ;
    var HandleProc : Integer ;
        proc : Pointer ;
    begin
        HandleProc := LoadLibrary(PChar(NameOfExt + '.dll'));
     
        if HandleProc <> 0
        then
            proc := GetProcAddress(HandleProc, 'Execute')
        else
            proc := nil ;
     
        ListOfExtension.Add(NameOfExt, HandleProc, proc) ;
     
        Result := proc ;
    end ;
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    C'est bien ça Alcatîz, après de longues recherche j'ai trouvé un post dans un forum (je ne sais plus lequel) et il suffit de remplacer par cetter ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    Pointer(@proc) := GetProcAddress(HandleProc, 'Execute')
    ...

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

Discussions similaires

  1. Chargement de librairie DLL
    Par MonsieurAk dans le forum Windows
    Réponses: 14
    Dernier message: 23/05/2007, 19h39
  2. [MFC VC.NET] Chargement dynamique de DLL
    Par vanitom dans le forum MFC
    Réponses: 3
    Dernier message: 26/01/2005, 13h56
  3. Chargement d'une DLL et utilisation du multithread
    Par Maitre Kanter dans le forum Langage
    Réponses: 6
    Dernier message: 07/09/2004, 23h18
  4. [UNIX Forte 6.1 G++] pbl chargement de librairie partagée
    Par claudio.matzke dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 09/10/2003, 14h45
  5. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

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