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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    mars 2003
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2003
    Messages : 57
    Points : 36
    Points
    36

    Par défaut [64 bits] Chargement dynamique d'une DLL 32 bits

    Bonjour,
    Je suis en Windows 10 (64 bits), Lazarus 1.8.4 et 2.0, FPC 3.0.4.
    Je teste actuellement Lazarus et je désire charger dynamiquement une DLL comme je le fais habituellement en Delphi 7.
    Problème :
    LoadLibrary ou SafeLoadLibrary me renvoient toujours 0
    Explo_dp.dll est une DLL écrite en Delphi
    ZipDll.dll est une DLL trouvé sur Internet pour tester

    Mes différents tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Var
    Handle : : THandle; // ou integer ou TLibHandle 
     
    Handle:= Windows.LoadLibrary('Explo_dp.dll'); 
    // ou 
    FICHIER:=REPERTOIRE_APPLI(TRUE)+'Explo_dp.dll';
    Handle:= Windows.LoadLibrary(PCHAR(FICHIER));
    // ou
    Handle:= dynlibs.LoadLibrary('ZipDll.dll');
    // ou 
    Handle:=SafeLoadLibrary('ZipDll.dll');
    Exemple de 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
     PROG_LNK, // Créer un raccourci
     PROG_MODIF_LNK : PROCEDURE(INFO : PCHAR);
     
    {$IFDEF Windows}
    FUNCTION TForm1.CHARGE_DLL : BOOLEAN;
      VAR
        FICHIER : STRING;
        HANDLE_EXPLO_DP_DLL : THandle;
          BEGIN
            RESULT :=FALSE;
            FICHIER:=PROC2.REPERTOIRE_APPLI(TRUE)+'Explo_dp.dll'; // 'ZipDll.dll'
            HANDLE_EXPLO_DP_DLL := Windows.LoadLibrary(PCHAR(FICHIER));// Toujours 0 ???????
            if HANDLE_EXPLO_DP_DLL <> 0 then
               begin
                  Pointer(PROG_LNK):=Windows.GetProcAddress(HANDLE_EXPLO_DP_DLL, 'CREER_LNK');
                  Pointer(PROG_MODIF_LNK) := Windows.GetProcAddress(HANDLE_EXPLO_DP_DLL, 'MODIF_LNK');
                  RESULT:=TRUE;
               END
             ELSE
               BEGIN
                  Showmessage('Il manque le fichier : '+FICHIER);
               END;
          END;
           {$ENDIF}

    Qui peut m'aider ?
    1) Pourquoi toujours 0
    2) Différences entre :
    Windows.LoadLibrary
    dynlibs.LoadLibrary
    SafeLoadLibrary

    Remarque :

    Explo_dp.dll contient entre autre :
    CREER_LNK : pour créer un fichier LNK et en paramètre le répertoire de destination
    MODIF_LNK : pour modifier un fichier LNK et en paramètre le nom du fichier LNK

    Ci-joint le fichier DLL
    D'avance merci
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    995
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 995
    Points : 2 649
    Points
    2 649
    Billets dans le blog
    2

    Par défaut

    Bonjour

    Tes DLL sont elles également en 64bits ou en 32Bits ? si elles sont 32 et que tu compiles en 64 bits c'est normal que cela ne fonctionne pas.

    Essayes d'utiliser les fonctions de l'unité DynLibs de Lazarus

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    mars 2003
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2003
    Messages : 57
    Points : 36
    Points
    36

    Par défaut Chargement dynamique d'une DLL

    Bonjour,
    Exact la DLL est de Delphi 7 donc 32 bits.
    Je vais faire des testes avec l'unité DynLibs.
    Merci pour la réponse.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    mars 2003
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2003
    Messages : 57
    Points : 36
    Points
    36

    Par défaut Chargement dynamique d'une DLL 32 bits dans un programme 64 bits

    Re-bonjour,
    J'arrive pas avec l'unité dynlibs.
    Je pose donc mon problème autrement :
    Comment charger dynamiquement d'une DLL 32 bits dans un programme Lazarus 64 bits ?.
    D'avance merci.

  5. #5
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    995
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 995
    Points : 2 649
    Points
    2 649
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par dennler Voir le message
    Re-bonjour,
    J'arrive pas avec l'unité dynlibs.
    Je pose donc mon problème autrement :
    Comment charger dynamiquement d'une DLL 32 bits dans un programme Lazarus 64 bits ?.
    D'avance merci.
    Bonsoir

    Tu ne peux pas, il faut que tes DLL soient compilé en 64bits.

    Si tu veux utiliser tes DLL 32 bits il faut que tu télécharges la version FPC 32bits pour pouvoir compiler en 32bits. tu dois télécharger et installer ce fichier pour la version 2.0 de Lazarus

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Responsable Pascal, Delphi et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    7 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

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

    Informations forums :
    Inscription : mars 2003
    Messages : 7 579
    Points : 54 094
    Points
    54 094
    Billets dans le blog
    2

    Par défaut

    Bonjour,

    La solution de BeanzMaster est la plus simple, car utiliser une DLL 32 bits dans une application 64 bits est fort compliqué. C'est clairement expliqué ici : https://blog.mattmags.com/2007/06/30...m-64-bit-code/.

    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]

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    mars 2003
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2003
    Messages : 57
    Points : 36
    Points
    36

    Par défaut Chargement dynamique d'une DLL 32 bits dans un programme 64 bits

    Bonjour,
    Merci pour tout, j'ai encore appris quelque chose.
    J'ai contourné, de ce fait, le problème :
    Comme ma DLL (32 bits) ne contient que des procédures "autonomes", il suffisait d'un petit programme sous Delphi 7 (32 bits) pour lancer la DLL.
    Sous Lazarus (64 bits) l'instruction ShellApi.ShellExecute me permet d'exécuter mon petit programme (32 bits).
    Encore merci.

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

Discussions similaires

  1. [D7] EConvertError lors du chargement dynamique d'une dll
    Par declencher dans le forum Langage
    Réponses: 3
    Dernier message: 11/02/2015, 14h52
  2. Réponses: 7
    Dernier message: 25/09/2013, 12h35
  3. Réponses: 5
    Dernier message: 28/04/2010, 18h18
  4. [CR.NET]Chargement dynamique d'une image
    Par Moah dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 14/12/2004, 12h46
  5. Réponses: 19
    Dernier message: 26/04/2004, 09h54

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