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

Delphi .NET Discussion :

[Débutant][D2005] Erreur compilation DLL


Sujet :

Delphi .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut [Débutant][D2005] Erreur compilation DLL
    Bonjour,

    Je débute à la fois dans le développement Delphi pour .net (avec D2005 Ed. Personnelle) et dans la création et l'utilisation de DLL.

    J'ai donc commencé à écrire une DLL de classe toute simple, en suivant le tutoriel de Tony Baheux:
    Projet DLL (Data.dll) avec une unité pour ma classe (DataAccess.pas) : j'ai une classe TDataAccess avec une variable publique (sans importance ici) et son constructeur. J'y ai créé une fonction CreateData renvoyant un TDataAccess dont le résultat est "TDataAccess.Create;"

    Seulement, lorsque je veux compiler ma DLL, j'ai le message d'erreur suivant : "E2297 La définition de procédure doit être la convention d'appel ILCODE" et rien de plus dans l'aide.

    Voici le code de mon unité DataAccess.pas : la compilation plante sur la ligne 27.
    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
    unit DataAccess;
     
    interface
     
    uses System.Data;
     
    type
      TDataAccess = class
      private
        { Déclarations privées }
      public
        DS: DataSet;
        constructor Create;
      end;
     
      function CreateData: TDataAccess; stdcall; export;
     
    implementation
     
    constructor TDataAccess.Create;
    begin
      inherited Create;
      // TODO: Ajouter ici le code du constructeur
      DS.ReadXMLSchema('DataSchema.xml');
    end;
     
    function CreateData: TDataAccess; stdcall; export;
    begin
      Result := TDataAccess.Create;
    end;
     
    end.
    Merci d'avance !

    waici

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut
    Ah... euh... bon ça marche en enlevant la directive "stdcall;"

    Mais.. j'ai maintenant une nouvelle erreur
    "E2395 Procédure non protégée autorisée uniquement en compilant avec {$UNSAFECODE ON}"

    Cette option ne rendrait-elle pas la DLL instable ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut
    Alors... lié ou non ? :
    J'ai placé la directive dans ma DLL, elle s'est donc bien compilée.

    Mais, lorsque j'appelle la procédure CreateData de ma DLL à partir de mon application hôte, j'ai l'erreur suivante à l'exécution :
    System.Runtime.InteropServices.MarshalDirectiveException "Can not marshal return value: The type definition of this type has no layout information"

    Les idées sont les bienvenues !

    waici

  4. #4
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    Alors moi quand je parle de DLL simple je fais vraiment un truc simple qui ne renvoie pas des types space genre TDataAccess (contente toi de renvoyer un INT deja un bon début)...
    Moi je me souvient j'ai fais comme toi, j'ai commencé par une DLL...la mienne faisait une addition...
    par exemple:

    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
     
    unit Addition;
     
     
    type
      Addition = class
      private
        { Déclarations privées }
      public
      end;
     
    implementation
     
     
     
    function Addition(a : integer; b : integer): Integer; stdcall; 
    begin
      Addition:= a + b;
    end;
     
    exports Addition;
    end.
    voila alors ca ca marche a coup sur ...et il me semble que le STDCALL est indispensable il définit la convention d'appelle entre tes fonction de DLL et ton programme...

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

Discussions similaires

  1. [Débutant]Erreur compilation classe héritée
    Par Nerziel dans le forum C++
    Réponses: 3
    Dernier message: 02/03/2007, 15h51
  2. Réponses: 2
    Dernier message: 09/12/2006, 14h42
  3. Erreur compilation DLL dans Eelphi 6
    Par jakouz dans le forum Langage
    Réponses: 2
    Dernier message: 25/05/2005, 16h38
  4. [Débutant]Erreur compilation !
    Par gandalf_le_blanc dans le forum AWT/Swing
    Réponses: 23
    Dernier message: 30/08/2004, 14h23
  5. [Débutant][JNI]Erreur de chargement de dll
    Par Agifem dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 24/04/2003, 14h36

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