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 :

DataSource et DLL


Sujet :

Langage Delphi

  1. #1
    Membre du Club Avatar de ghost942
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 112
    Points : 50
    Points
    50
    Par défaut DataSource et DLL
    Bonjour,

    J'essaie de piloter ma base de données de mon application principale par une
    fonction extérieure (DLL). Mais l'appel a la fonction DLL est un échec.

    Voici la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Rating(var datasource:Tdatasource):integer; stdcall;
    begin
      try
      datasource.DataSet.First;
      repeat
        datasource.DataSet.Next;
      until Datasource.DataSet.Eof;
      except;
        showmessage('Rating: Error');
      end;
      result:=0;
    end;
    La DLL est bien implantée puisque j'appelle une fonction Somme() pour tester, et la connexion statique est donc OK.

    Comment faire pour que cela fonctionne?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 522
    Points : 25 052
    Points
    25 052
    Par défaut
    je trouve ton code bizarrement écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Rating(var datasource:Tdatasource):integer; stdcall;
    begin
      try
      datasource.DataSet.First;
      repeat
        datasource.DataSet.Next;
      until Datasource.DataSet.Eof;
      except;
        showmessage('Rating: Error');
      end;
      result:=0;
    end;
    moi, je l'aurais fait ainsi

    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
    function Rating(var ADataSource: TDataSource): Integer; stdcall;
    begin
      if Assigned(ADataSource) and Assigned(ADataSource.DataSet) then
      begin
        with ADataSource.DataSet do
        begin
          if not IsEmpty() then
          begin
            First(); // un First sur un Ensemble vide peut parfois planté !
            while not EOF do
            begin
               // Result := Field...
               Next();
            end;
          end;
        end;
      end;
    end;
    Ensuite pour la gestion d'Exception, hum, en général, je préfère renvoyer un code d'erreur (genre -1) ... et que la DLL contienne une fonction GetLastError ... car le déclenchement d'exception peut lui même provoquer une erreur dans le programme selon le partage de la mémoire (j'ai eu des soucis je crois à ce sujet)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club Avatar de ghost942
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 112
    Points : 50
    Points
    50
    Par défaut
    ah cool, merci. Je vais tester ton code

    (désolé pour la réponse tardive mais j'avais oublié de mettre la notification par émail)

  4. #4
    Membre du Club Avatar de ghost942
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 112
    Points : 50
    Points
    50
    Par défaut
    Hum, non, j'ai toujours un beau plantage de la DLL quand j'appelle cette fonction.

  5. #5
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Moi j'aime pas passer directement des objets a une Dll ... D'ailleur c'est assez casse-figure.

    J'opterais pour une classe "controleur" possedant une interface qui serait transmise a la dll.
    La dll manipule le controleur par les methodes de son interface et le controleur instancié dans l'executable appelle les methodes du Dataset (wrapper)

    Ceci dit, c'est plus une question de conception qu'une reponse direct a ton probleme
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  6. #6
    Membre du Club Avatar de ghost942
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 112
    Points : 50
    Points
    50
    Par défaut
    Mon idée de base c'est d'avoir des "plug-in".

    D'une cote, j'ai mon appli. qui gère une base de données (SGBD Firebird)
    et d'un autre cote, j'aimerai pouvoir faire des traitements spécifiques
    qui seraient sous la forme de DLL que l'utilisateur aurait, ou aurait pas.

    Donc voila, j'aimerais pouvoir acceder/piloter mes datasets a partir d'une DLL...

    Par contre, je ne vois pas trop pour ton idée de classe controleur...?

  7. #7
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Dans le cadre de Plugin, 2 solutionsont a envisager :

    Soit tous les plugins on une structure identique (ou tres tres proche) et on peut definir uen serie de methodes communes a toutes ces unités pour la manipuler.

    Dans ce cas, on creer une classe avec une interface.
    LA Dll s'occupe d'exporter cette interface vers l'exe qui manipule la Dll via ces methodes.
    Apres la Dll s'occupe de personaliser les traitments en interne.

    Soit tu fait le contraitre. C'est a dire qu'aucune structure comune n'etant envisageable, il te faudra passer par une sorte de controleur ou wrapper de classe qui sera exportés de l'exe pour manipuler les objets internes a l'exe.
    Dans ton cas le dataSet.

    J'entends par controleur une classe qui possede une proprietee de type dataset, dans laquelle tu affectera le dataset a manipuler dans la Dll.
    Cette classe implemente une interface qui sera transmise a la Dll.
    Le controleur va dont implementer des methodes (declarées dans l'interface) qui sont grosso-modo les memes que celles du DataSet que tu souhaite manipuler. Ces methodes feront appel aux methodes du dataset en lui transmettant les memes parametres. Ce ne sotn que des fonctions de redirection des parametres vers celles du DataSet.

    Ne puvant pas transmettre directement un objet a une Dll, il te faut donc creer un opbjet specifique (un objet implementant une interface) qui lui pourat etre transmis a la dll en parametre de fonction ....

    Tu peux creer un contrleur unique pour "piloter" l'ensemble de tes classes qui doivent etre utilisées dans la ou les dlls .. ou creer plusieurs objets controleurs ...

    Pour plus d'infos je t'invite a te pencher sur les technqiues de creation de plugins, et de gestion des interfaces.
    Sur ce site, il y a un tres bon exemple estrait du livre de paul Toth au format PDF traitant justement la gestion des plugins. Ca te donnera de bonnes bases
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  8. #8
    Membre du Club Avatar de ghost942
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 112
    Points : 50
    Points
    50
    Par défaut
    Je vais regarder cela en détail alors.

    Merci!

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

Discussions similaires

  1. [CR] Infos sur l'utilisation de dll
    Par step dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 09/08/2002, 11h35
  2. Declarer une dll Delphi ?
    Par DelphiCool dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/07/2002, 10h07
  3. Débug de DLL
    Par Bayard dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/07/2002, 15h08
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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