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

Langage Delphi Discussion :

Comment créer une dll Win32 sous Delphi ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut Comment créer une dll Win32 sous Delphi ?
    Bonjour

    J'ai un petit problème.....

    Je souhaite créé une dll win32 sous delphi2005, me permettant d'écrire un fichier xml avec XmlDocument. Dans un premier temps, disposant déja d'un document xml j'ai essayé de faire une dll simple me permettant de récupérer la version du code xml (1.0).
    Mais lorsque je souhaite utiliser la dll ainsi créée, j'obtiens une erreur d'exécution m'indiquant qu'il est impossible de charger ma dll.

    voici mon 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
    library MyDllWin32;
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;
     
    {$R *.res}
     
    function lectureVersion ():string;export;
    var
    resultat: string;
    XMLDocument1: TXMLDocument;
    begin
        resultat:='null';
        XMLDocument1.Create('C:\\Documents and Settings\\PDS\\Mes documents\\fiche.xml');
        XMLDocument1.LoadFromFile('C:\\Documents and Settings\\PDS\\Mes documents\\fiche.xml');
        resultat:=XMLDocument1.Version;
        XMLDocument1.Destroy;
        lectureVersion:=resultat;
    end;
    exports lectureVersion;
     
    begin
    end.
    Je suis sûr que le probleme viens de la création de ma dll et non de mon appel de la dll dans mon projet (j'en ai déja fais plusieurs sans aucun problème). Voyez vous une anomalie dans mon code?

    Ps: la dll à été écrite avec l'expert de dll sous delphi 2005 (delphi Win32)
    je débute en objet et en pascal

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    La création et la destruction de ton TXMLDocument n'est pas bonne :
    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 MyDllWin32; 
     
    uses 
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
      Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls; 
     
    {$R *.res} 
     
    function lectureVersion ():string;export; 
    var 
    resultat: string; 
    XMLDocument1: TXMLDocument; 
    begin 
        resultat:='null'; 
     
        //----------------------
        XMLDocument1 := TXMLDocument.Create('C:\\Documents and Settings\\PDS\\Mes documents\\fiche.xml');
        //----------------------
     
    XMLDocument1.LoadFromFile('C:\\Documents and Settings\\PDS\\Mes documents\\fiche.xml'); 
        resultat:=XMLDocument1.Version; 
     
        //----------------------
        XMLDocument1.Free;
        //----------------------
     
        lectureVersion:=resultat; 
    end; 
    exports lectureVersion; 
     
    begin 
    end.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut
    bonjour MD Software

    merci pour ton aide. J'ai donc modifié ma DLL mais le résultat est toujours le même, j'obtiens une erreur a l'exécution qui m'indique qu'il est impossible de chargé la DLL.
    J'ai don créé une autre dll, encore plus simple ne faisant pas appel à XMLDocument, elle ne fait que renvoyer une string, et la tout marche impeccable --> donc ma méthode d'appel de la dll dans mon programme est correcte, il s'agit d'une mauvaise conception de ma DLL.

    Je ne comprend pas, vois tu autre chose?

  4. #4
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Je cherche,

    Mais d'abord, tu dois savoir que renvoyer un String n'est pas bien pour une dll. Tu dois renvoyer un PChar
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  5. #5
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    L'erreur vient du fait queprovoque une erreur abstraite.

    [edit]Heuuu..... non rien, c'est mon doc XML qui n'est pas très conforme.
    [edit]Tu as essayé d'exécuter ton code dans une application indépendante, juste pour voir si ton code est valide avec le doc XML que tu passes ?
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  6. #6
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut
    Tu as essayé d'exécuter ton code dans une application indépendante, juste pour voir si ton code est valide avec le doc XML que tu passes ?
    Oui j'ai essayé et tout se passe normalement; la fonction me retourne bien la version de mon document XML (1.0).

    En fait le code ci-dessous fonctionne sans problème:

    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
     
    library MyDllWin32;
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;
     
     {$R *.res}
    function LectureVersion():string;stdcall;
    var
    resultat: string;
    XMLDocument1: TXMLDocument;
    begin
          resultat:='ok';
          lectureVersion:=resultat;
    end;
    exports
    LectureVersion;
     
    begin
    // init Dll
    end.
    la Dll retourne bien la chaine 'ok' au programme qui l'appelle.
    En revanche le programme ci dessous ne marche pas (une seule ligne a été rajoutée):

    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
     
    library MyDllWin32;
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;
     
     {$R *.res}
    function LectureVersion():string;stdcall;
    var
    resultat: string;
    XMLDocument1: TXMLDocument;
    begin
          resultat:='ok';
          XMLDocument1:=TXMLDocument.Create('C:\\Documents and Settings\\PDS\\Mes documents\\fiche.xml');
          lectureVersion:=resultat;
    end;
    exports
    LectureVersion;
     
    begin
    // init Dll
    end.
    A l'exécution du programme qui appelle ma dll, une exeption est levée, avec le message suivant:
    "CoInitialize n'a pas été appelé"

    Je ne comprend vraiment rien. Qu'en penses tu?

  7. #7
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Ah, ben voilà, il faut faire ce qu'il te dit, appeler CoInitialize au début de la fonction.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  8. #8
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut
    Ah, ben voilà, il faut faire ce qu'il te dit, appeler CoInitialize au début de la fonction.
    pas si facile, cette fonction est très compliquée --> je débute

    Mais en fait, il y a un petit détail que je ne t'ai pas dit et qui a certainement son importance.
    Lorsque j'essai de lire la version de mon fichier Xml depuis un projet et non une dll, tout marche car j'utilise le composant TXMLDocument (disponible dans la palette d'outil depuis un projet Delphi Win32). Or lorsque dans ce même projet, je supprime ce composant et que je programme la classe TXMLDocument directement depuis le code, j'obtiens une erreur à l'exécution.
    Or je me suis apperçu que lorsque la ligne "TXMLDocument.Create" s'exécute, une tâche (thread) est lancée. Cela ne serait-il pas la cause de l'erreur? Lorsque j'utilise le composant l'erreur ne se produit pas car des initialisations sont certainement faites (notamment avec l'inspecteur d'objet) que je ne fait pas dans mon code.
    J'ai donc pensé créer une dll incluant une fiche, donc sur laquelle je pourrais placer le composant TXMLDocument, mais cela ne fonctionne pas.

    Voici mon code:
    --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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    library MaDllW32;
     
    uses
      SysUtils,
      Classes, Forms,
      MaDllWin in 'MaDllWin.pas' {Form5};
     
    {$R *.res}
     
    function LectureVersion():string;stdcall;
    var
      sResu:string;
    begin
     Form5 := TForm5.Create(Application);
     Form5.LectureVersionCpts();
     sResu:= Form5.resultat;
     Form5.Free;
     LectureVersion := sResu;
    end;
     
    function Lecture():string;stdcall;
    var
      sResu:string;
    begin
     Form5 := TForm5.Create(Application);
     Form5.Edit1.Text := 'Titi';
     sResu := Form5.Edit1.Text;
     Form5.Free;
     Lecture := sResu;
    end;
     
    exports
     LectureVersion,
     Lecture;
    la fonction lecture n'est pas importante, elle est là seulement pour moi vérifier que le lien a bien été fait entre ma fiche et ma dll.

    cette partie est liée à la fiche que voici:

    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
     
    unit MaDllWin;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;
     
    type
        TForm5 = class(TForm)
        XMLDocument1: TXMLDocument;
        Edit1: TEdit;
      private
        { Déclarations privées }
     
      public
        { Déclarations publiques }
        resultat: string;
        Procedure LectureVersionCpts();
      end;
     
    var
      Form5: TForm5;
     
    implementation
     
    Procedure TForm5.LectureVersionCpts();
     
    begin
          resultat:='ok';
          XMLDocument1.Create('C:\\Documents and Settings\\PDS\\Mes documents\\fiche.xml');
          XMLDocument1.LoadFromFile('C:\\Documents and Settings\\PDS\\Mes documents\\fiche.xml');
          resultat:=XMLDocument1.Version;
          XMLDocument1.Free;
     
    end;
     
    {$R *.dfm}
     
    end.
    Voila, qu'en penses tu? (la je sais plus quoi faire)...

  9. #9
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut
    Ayé j'ai réussi
    tu avais raison il fallait bien utiliser CoInitialize, Voici mon 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
    25
    26
    27
    28
     
    library MaDllW32;
     
    uses
      SysUtils,
      Classes, Forms,ActiveX,
      MaDllWin in 'MaDllWin.pas' {Form5};
     
    {$R *.res}
     
    function LectureVersion():string;stdcall;
    var
      sResu:string;
    begin
     Form5 := TForm5.Create(Application);
     Form5.LectureVersionCpts();
     sResu:= Form5.resultat;
     Form5.Free;
     LectureVersion := sResu;
    end;
     
     
    exports
     LectureVersion;
     
    begin
    CoInitialize(nil);   // il faut rajouter un uses ActiveX
    end.
    En ce qui concerne la fiche qui est liée à ma dll, elle n'a^pas changé.
    Merci de t'être intéressé a mon problème.
    A+

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

Discussions similaires

  1. Comment appeler une dll VB6 sous delphi
    Par zanoubya dans le forum Débuter
    Réponses: 6
    Dernier message: 05/10/2009, 18h04
  2. Réponses: 3
    Dernier message: 16/06/2008, 15h23
  3. [VB6]comment créer une dll
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 12/04/2006, 14h32
  4. comment utiliser une DLL win32 en C??
    Par Jayceblaster dans le forum C
    Réponses: 8
    Dernier message: 31/03/2006, 12h49
  5. créer une procedure stockée sous delphi
    Par gudul dans le forum Bases de données
    Réponses: 1
    Dernier message: 09/11/2004, 14h06

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