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] Fonction d'une DLL récalcitrante


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 120
    Par défaut [Lazarus] Fonction d'une DLL récalcitrante
    Bonsoir,

    Petit problème avec une DLL. Elle est bien créée, la fonction est correstement intégrée et est bien présente dans la partie "exports", mais dans mon programme de test, l'appel de la fonction génère toujours une erreur "identifier not found" ...

    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
     
    begin
      dll:=Loadlibrary('libUtilsUnit.dll');
      TestString:='';
      If Edit1.Text<>'' then
      begin
           If Edit2.text<>''
           then
           begin
                Pointer(SplitString):=GetProcAddress(dll,'SplitString');
                TTest:=SplitString(Edit1.Text, Edit2.Text);
                For i:=0 to TTest.Count do
                begin
                      TestString:=TestString+TTest[i];
                end;
           end;
           showmessage(TestSTring);
      end;
     
    end;
    Je ne vois d'ou ca vient. Si vous avez une idée ...

    Merci

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    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 051
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Dans la dll, la fonction reçoit-elle bien un alias ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exports  
       SplitString   index 1   name 'SplitString';
    Le résultat de LoadLibrary est-il bien supérieur ou égal à 32 ?
    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 confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 120
    Par défaut
    Citation Envoyé par Alcatîz Voir le message
    Bonjour !
    Bonjour,
    Citation Envoyé par Alcatîz Voir le message
    Dans la dll, la fonction reçoit-elle bien un alias ?
    [...]
    Ah ... ben non. Je ne savais pas que ca existait. L'exemple donné sur le site lazarus-cc est bien flou ...

    Citation Envoyé par Alcatîz Voir le message
    Le résultat de LoadLibrary est-il bien supérieur ou égal à 32 ?
    Eh beh, ca atteint 33554432. C'est grave Docteur ?
    Par contre j'ai toujour l'erreur (j'ai commenté le code qui la génère pour récupérer le résultat de loadLibrary, sans ca ...) malgré la recompil de la DLL avec l'alias.

    En tout cas merci de ta réponse.

  4. #4
    Membre chevronné

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Par défaut
    Voici un exemple simplissime basé sur ton code, et qui fonctionne (sous windows) :

    code de la dll
    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
    library libUtilsUnit;
     
    {$mode objfpc}{$H+}
     
    uses
      Classes
     
    function SplitString(s1, S2 : string): string; stdcall;
    begin
      SplitString := S1 + S2;
    end;
     
    exports
      SplitString; //je n'en ai qu'un donc je ne précise pas. 
                     //le nom sera 'SplitString' et l'index 1
     
     
    begin
    end.
    Petit projet avec un bouton et deux edits:
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
     TTest, TestString: string;
     dll : thandle;
     SplitString : function(s1,s2 : string): string; stdcall;
     //i : integer;
    begin
     
      dll:=Loadlibrary('libUtilsUnit.dll');
      If dll = 0 then Exit;
     
      //TestString:='';
      If Edit1.Text<>'' then
      begin
           If Edit2.text<>''
           then
           begin
                Pointer(SplitString):=GetProcAddress(dll,pansichar('SplitString'));
                TTest:=SplitString(Edit1.Text, Edit2.Text);
                //For i:=1 to TTest.Count do  // << c'est quoi comme objet TTest?
                //begin
                //      TestString:=TestString+TTest[i];
                //end;
           end;
           showmessage(Ttest);
      end;
     
    end;

    Ah oui j'oubliais : la dll est dans un repertoire ou le programme va la trouver sans forcer, en l'occurence dans le meme repertoire que le programme lui meme, faute de quoi il faudra soit donner son chemin lors du loadlibrary, soit l'enregistrer sous windows...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 120
    Par défaut
    Citation Envoyé par Clandestino Voir le message
    Voici un exemple simplissime basé sur ton code, et qui fonctionne (sous windows) :
    [...]

    Ah oui j'oubliais : la dll est dans un repertoire ou le programme va la trouver sans forcer, en l'occurence dans le meme repertoire que le programme lui meme, faute de quoi il faudra soit donner son chemin lors du loadlibrary, soit l'enregistrer sous windows...
    Ok merci. C'est pas encore ca, mais ca avance. Je comprends mieux comment tout ca fonctionne, j'étais assez moind compte

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 120
    Par défaut Ca marche ;-)
    ok, cette fois ca marche

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

Discussions similaires

  1. Appel de fonction d'une DLL en TANSAC SQL
    Par sylvain114d dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/01/2006, 10h21
  2. Comment connaître les fonctions d'une DLL ?
    Par bencot dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 15/06/2005, 09h25
  3. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  4. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57
  5. [VB6] Ajouter un commentaire à une fonction d'une DLL
    Par Ace303 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/06/2003, 08h14

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