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 :

Utiliser un objet C++ en Delphi.


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut Utiliser un objet C++ en Delphi.
    Bonjour la communauté Delphiste,

    Après une recherche sur internet, j'ai trouvé ceci:
    http://www.rvelthuis.de/articles/articles-cppobjs.html

    Pour l'application que je développe (à but commercial), j'ai choisi un design un peu particulier mais élégant:

    Développer une classe C++ qui encapsule Sqlite, exportée celle-ci via une Dll comme pour ce tuto, et utiliser le tout dans Delphi.

    Pratique quand on ne veut pas se priver d'un librairie C, et qu'on souhaite améliorer le tout avec du C++.

    Tout se passe bien...sauf à la tentative de libération de l'objet, en mode débug.

    Auriez-vous par hasard mis en place ce style de solution? Les sources du tuto semblent dater, car l'objet console c'est du conio, donc borland C++ assez vieux.

    Merci de vos réponses.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Ce n'est le code du tutoriel qui va nous aider à comprendre ton problème de libération, tu parle de l'objet C++ ou de l'objet Delphi ?
    Debug seulement ?
    si oui, peut-être une exception trappée que tu vois quand même parce que tu as activé "arrêter sur Exception Delphi"

    J'ai pour ma part utilisé des DLL développés en C++ comme celle de MySQL, je n'ai pas eu de problème particulier ... après cela dépend de la DLL, il peut être nécessaire de libérer tous les pointeurs (la DLL doit disposer d'une méthode Dispose ou équivalent, pour libérer connexion, dataset, record, ...) et enfin appeler le FreeLibrary ...

  3. #3
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Il s'agit de la libération de l'objet C++, la méthode FreeMe() étant appeler depuis Delphi, avec tout les standard call, cdecl et virtual.

    Comme dans son exemple, j'utilise la Dll de manière statique avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    const
      DLLName = '.\DLLObject.dll';
     
    function NewSql;  stdcall; external DLLName index 1;
    Tu utilisais l'objet C++ directement ou un wrapper des fonctions?

    Car, le design que je souhaite utiliser c'est bien l'objet avec la notation pointée...Comme dans son tutoriel.

    Bon après quelques modifs, j'ai le message suivant, dans la capture. Les outils se êlent de plus en plus de manager le code...finit la liberté
    Images attachées Images attachées  

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Salut Actarus

    Pour autant que je sache MySQL c'est du C, pas du C++...

    pour ce qui est de ton problème, à ta place je passerais tout simplement par une Interface (pas la peine de faire du COM pour autant).

    c'est plus simple à gérer (à mon sens) et c'est plus propre qu'un classe virtuelle abstraite.

    la seule chose à savoir c'est que Delphi gère automatiquement les appels à AddRef et Release :
    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
     
    type
     ISQLite = Interface
       procedure Method(...);
     end;
     
    function NewSQL:ISQLite; external DLLName; stdcall;
     
    var
      SQLite: ISQLite;
    begin
      SQLite := NewSQL; // appel à AddRef
      SQLite.Method(...);
      SQLite := nil; // appel à Release, c'est même automatique si la variable est locale sans qu'il soit besoin de la forcer à nil
    end;
    NB: techniquement une interface c'est un pointeur vers un pointeur sur un tableau de méthodes...ce n'est donc pas très loin de la classe abstraite

  5. #5
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    En effet ça pourrait être une solution...ça av commencer à être compliqué ce design...

    Bon, je vais chercher des infos sur les interfaces, j'en ait déjà codée, mais je suis un poil rouillé là.

    Merci à vous de votre aide. Je vous tient au courant.

    Cependant, j'espère garder la solution C++

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Citation Envoyé par Caine Voir le message
    Tu utilisais l'objet C++ directement ou un wrapper des fonctions?
    Je l'ai vu une fois, entre Borland Builder C++ et Delphi 3, où à la sauvage, il y avait un mappage direct d'une classe C++ et une classe Delphi, faut être sur que les types choisis entre C++ et Delphi sont bien compatible, c'est quand même trés osé ...
    En général, mieux vaut ignorer totalement comment sont implémentés les DLL que l'on utilise, en Delphi, cela reste qu'un tas de fonction que l'on intègre soit même dans un objet wrapper si l'on veut absoluement écrire de l'objet ...

    sinon, les interfaces, c'est un bon conseil, faudrait aussi un jour que j'essaye d'en faire SANS passer par un objet COM, ...


    Sinon redéfinir un Free dans une classe, hum, je n'aurais pas osé, mieux faire mettre un ReleaseConsole appelé manuellement dans une surcharge du Destroy, mais j'ai l'impression que tu l'as appelé FreeMe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure Free; virtual; cdecl; abstract;



    Citation Envoyé par Paul TOTH Voir le message
    Pour autant que je sache MySQL c'est du C, pas du C++...
    Ah, moi ma vieille DLL Cliente MySQL 3.23.49 est contient des messages d'erreur typique de Microsoft Visual C++ ... ce n'est peut-être pas une version officielle ...

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Je l'ai vu une fois, entre Borland Builder C++ et Delphi 3, où à la sauvage, il y avait un mappage direct d'une classe C++ et une classe Delphi, faut être sur que les types choisis entre C++ et Delphi sont bien compatible, c'est quand même trés osé ...
    En général, mieux vaut ignorer totalement comment sont implémentés les DLL que l'on utilise, en Delphi, cela reste qu'un tas de fonction que l'on intègre soit même dans un objet wrapper si l'on veut absoluement écrire de l'objet ...
    j'ai déjà fait cela sous Linux pour essayer de rendre une application Kylix indépendante du wrapper QT...c'est faisable mais c'est très pénible à coder

    Citation Envoyé par ShaiLeTroll Voir le message
    sinon, les interfaces, c'est un bon conseil, faudrait aussi un jour que j'essaye d'en faire SANS passer par un objet COM, ...
    c'est on ne peu plus simple: )

    Citation Envoyé par ShaiLeTroll Voir le message
    Ah, moi ma vieille DLL Cliente MySQL 3.23.49 est contient des messages d'erreur typique de Microsoft Visual C++ ... ce n'est peut-être pas une version officielle ...
    ce que je voulais dire, c'est que la DLL ne publie que des fonctions utilisant des types C de base, qu'elle soit écrite en C++ est secondaire

  8. #8
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Une DLL par définition n'exporte que du C, des types C et des fonctions (voir même void) C dont le nom est non corrélé, d'où le extern de la fonction de création.

    Bon, comme j'en ai eu marre, ayant assez perdu de temps avec cette tentative, dès fois il faut que je reste dans le connu, j'ai coder en une heure un wrapper sur les fonctions Sqlite utiles pour mon projet.

    Et, oui, une interface est le seul moyen sûr de garantir tout ça.

    Dès fois, mon enthousiasme à croire dans la simplicité me perdra!

    Bon, sujet abandonné.

    Merci à tous de votre aide.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    J'ai enlevé le délestage car ce sujet comporte des informations intéressantes quand même.

  10. #10
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    J'ai enlevé le délestage car ce sujet comporte des informations intéressantes quand même.
    forcément j'ai répondu ... ah ben voila, maintenant ça va partir en cacahuète

  11. #11
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut Du neuf...
    Pas de problème pour le tag délestage...je ne voulais pas encombrer le serveur avec mon pb

    De plus, quand j'ai traduis la classe C++ en Delphi pur, je me suis aperçu d'une erreur.

    Je ne libérais pas avec Sqlite3Free un 'objet' alloué par cette librairie. Je pense qu'au moment de l'appel du destructeur de l'objet C++, la libération des membres échouait à cause de cet 'objet'.

    Quand j'aurais le temps, je corrigerais et je vous dirais si ça marche.

    Je ne vois pas de raisons valables que toutes les autres méthodes C++ fonctionnent et que seul le destructeur échoue sauf ce bug de libération.

Discussions similaires

  1. [delphi 5,6,7] utiliser un objet dans une procédure
    Par wizdom dans le forum Langage
    Réponses: 3
    Dernier message: 27/01/2006, 15h38
  2. [D2005]Comment utiliser des assembly développées en delphi
    Par Valéry dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 16/08/2005, 18h36
  3. (Problème) Utilisation de l'API mySQL [Delphi 2005 Perso]
    Par will-scs dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/08/2005, 18h26
  4. Utilisation d'objets pour imprimer
    Par alainvh dans le forum Composants VCL
    Réponses: 3
    Dernier message: 02/12/2004, 10h25
  5. utilisation d'objets ADO pour CMS sur POSTGRESQL7.3.2
    Par turbok dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 10/10/2003, 09h29

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