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

Free Pascal Discussion :

Problème de référencement d'une DLL [Free Pascal]


Sujet :

Free Pascal

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 143
    Par défaut Problème de référencement d'une DLL
    Bonjours, voici mon problème :

    Quelqu'un m'a fournis une DLL programmée en pascal et il m'est impossible de la référence dans la base de registre de windows en utilisant la fonction Regsvr32.
    J'obtiens le message d'erreur suivant :

    Load Librairy a échoué. une routine d'initialisation d'un librairie dynamique (dll) a échoué
    Hors avec son executable les appels à la dll fonctionnent très bien !

    La structure du fichier source de la DLL respecte le schéma suivant :

    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
     
    library trench; {le nom de notre dll}
    Uses crt,Windows;
     
    function passage(p1,p2 :pchar):boolean; stdcall;  { La fonction que l'on veut exporter }
    var
    Param1,Param2:string;
    ok:boolean;
    begin   { debut }
      Param1 := StrPas(p1);
      Param2 := StrPas(p2);
      ok := false;
      if (Param1=Param2) then
      begin
         ok := true;
      end;
      result := ok ; { le resultat sous forme de booleen}
    end ; { fin de la fonction }
     
    Exports { la partie qui stipule les exports }
    passage;
     
    begin
    { code au chargement de la dll, ici rien... }
    end.
    Merci d'avance à ceux qui pourront m'aider à rendre cette DLL compatible avec windows afin de pouvoir l'utiliser dans d'autres langage qu'en pascal.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


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

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

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

    Il me semble qu'il faille spécifier la directive export dans la déclaration de la fonction passage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function passage(p1,p2 :pchar):boolean; stdcall; export;
    et donner un index (et éventuellement un alias) dans la section exports :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exports 
    passage index 1;
    Je ne vois pas trop à quoi sert la déclaration de crt dans la clauses uses ?

    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é
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 143
    Par défaut
    Merci je vais tester tout ça et vous tenir au courant.
    La clause crt ne sert à rien ici car c'est un exemple de test mais elle est utile dans la vrai DLL j'ai simplement oublié de la retirer !

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 143
    Par défaut
    Avec ce code j'obtiens toujours le même message d'erreur... je désespère peut être dois-je changer d'EDI pour créer des dll compatibles avec Windows ?

  5. #5
    Responsable Pascal, Lazarus et Assembleur


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

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 062
    Billets dans le blog
    2
    Par défaut
    As-tu essayé de tester LoadLibrary et GetProcAddress sur ta dll dans un petit prog ? Essaye également d'ajouter un alias après l'index :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exports 
    passage index 1 alias 'passage';
    Au fait, quel code d'erreur renvoie exactement Regsvr32 ?
    http://support.microsoft.com/default.aspx?kbid=249873
    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]

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 143
    Par défaut
    En fait j'arrive très bien importer ma dll à partir d'un programme pascal.

    C'est lorsque j'essai d'importer ma dll dans un autre langage (en l'occurence VB6 ici) que ça deviens un vrai calvaire car la DLL doit être enregistrée dans la base de registre.

    Même l'api LoadLibrary echoue lorsque j'essai un chargement dynamique "manuel" alors que sous dev-pascal cette fonction marche parfaitement !

    L'ajout d'un alias ne change toujours pas le problème

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Gio,

    Normalement, pour faire une DLL utilisable par d'autres langages, il faut déclarer les fonctions en stdcall (ou quelque chose comme ça, je ne sais plus exactement), car on ne passe pas les paramètres en Pascal comme avec d'autres langages.

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 143
    Par défaut
    Oui c'est bien ce que j'ai fais au départ (cf le code source sur mon premier mssage).

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Lio,
    Citation Envoyé par Cravis Voir le message
    Oui c'est bien ce que j'ai fais au départ (cf le code source sur mon premier mssage).
    Oups, ça m'avait échappé.

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 143
    Par défaut
    Je crois avoir trouvé : bien que ma dll soit bien une DLL 32bits, elle ne respecte pas les conventions COM :
    (j'ai trouvé ça grace à un convertisseur de DLL il fallait que je décoche Com based dll pour que la convertion réussisse)

    Alors j'ai deux questions à ce propos :
    - Qu'est ce que cette normalisation COM ?
    - Peut-on avec free pascal compiler une dll qui respecte cette norme ?

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 143
    Par défaut
    Voici la solution que j'ai trouvé :

    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
     
    library Project1;
     
    uses
      SysUtils,
      Windows,
      ComServ;
     
    function passage(p1,p2 : pchar):boolean; stdcall;
    var
       paramet1 : string;
       paramet2 : string;
       sortie : string;
    begin
      paramet1:= StrPas(p1);
      paramet2:= StrPas(p2);
      sortie := 'Paramètres : ' + paramet1 +' et ' + paramet2;
      messagebox(0,pchar(sortie),'Sortie', MB_OK);
      result := true;
    end;
     
    exports
      passage index 1,
      DllGetClassObject,
      DllCanUnloadNow,
      DllRegisterServer,
      DllUnregisterServer;
     
    {$R *.RES}
     
    begin
    end.
    Je l'ai compilé avec Delphi, car free pascal n'inclue pas la librairie ComServ.

    Un grand merci à ceux qui ont essayé de m'aider.

  12. #12
    Membre chevronné

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Par défaut
    Bonjour,

    Nous parlons bien de dll et pas d'activeX?
    Pour une dll devant etre utilisée par des applications, il n'y a pas grand intérêt à la référencer dans la base de registre de windows...

    L'appel à la dll de manière classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Program CallOfMydll;
     
    function passage(p1,p2 : pchar):boolean; stdcall; external 'testdll.dll' name 'passage';
     
    var b : boolean;
    begin
    b:=passage('paramètre 1','paramètre 2');
    end.
    Fonctionne parfaitement si ta dll (compilée avec Freepascal) est dans le repertoire de l'application, ou si ta dll est dans le repertoire system32 de ta version de windows...
    Tu peux te passer de Delphi pour celà.

  13. #13
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 143
    Par défaut
    Oui de pascal à pascal cela fonctionne mais le problème est que je devais linker ma DLL dans visual basic et pour ce faire la DLL dois respecter au minimum les conventions COM.

    Le référencement dans la base de registre me permet uniquement de vérifier que la procédure LoadLibrary réussi ça ne m'apporte rien de plus en effet.

    Pour l'instant FreePascal n'intègre pas d'équivalent de la librairie ComServ (sur le site officiel on peut d'ailleurs voir que ça reste l'un des points à développer à plus ou moin court terme).

    Donc ne t'inquiète pas je sais parfaitement utiliser une dll, mon seul soucis étant de la rendre compatible avec d'autres langages que freepascal étant donné que les librairie de normalisation COM (norme effective depuis l'apparition de win95 quand même) ne sont pas distribuées avec le compilateur.

    Et non en effet mon but n'est pas de créer un activeX (qui est un format particulier de DLL com).

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

Discussions similaires

  1. Problème d'importation d'une DLL dans CVI
    Par samanderson dans le forum Windows
    Réponses: 16
    Dernier message: 16/08/2006, 15h45
  2. [Win32]Problème au chargement d'une DLL C++
    Par FamiDoo dans le forum MFC
    Réponses: 22
    Dernier message: 05/07/2006, 12h10
  3. [MFC] Problèmes d'inclusion d'une DLL
    Par CaptnB dans le forum MFC
    Réponses: 1
    Dernier message: 12/05/2006, 19h01
  4. [VB] Problème de chargement d'une DLL
    Par Elijha dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/05/2006, 10h24
  5. Problème de création d'une dll...
    Par adrien954 dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/10/2005, 11h46

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