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

C++Builder Discussion :

Utilisation de DLL Microsoft


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut Utilisation de DLL Microsoft
    Bonjour à toutes et à tous,

    J'aimerais savoir si quelqu'un d'entre vous a déjà réussi à instancier sous C++ Builder XE2 des classes exportées depuis une DLL développée sous Visual Studio C++ 2010 ?

    Merci par avance,

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut
    Merci Crayon pour les liens, je vais lire tout ça;
    J'ai essayé d'utiliser les utilitaires IMPDEF et IMPLIB, mais cela ne fonctionne pas bien, en fait, les 2 formats des fichiers DEF entre Visual Studio C++ et XE2 ne se ressemblent pas trop, du coup, j'avais pensé pour utiliser ces utilitaires, quitte à modifier à la main les fichiers DEF, mais je ne comprend pas comment passer de l'un à l'autre ...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut
    Après lecture, il s'avère que la partie "5. Utilisation statique d'une DLL "étrangère" n'est possible que sur des DLL comportant des méthodes et non pas des classes ...

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 429
    Points : 24 794
    Points
    24 794
    Par défaut
    J'ai eu affaire à une DLL en Visual aussi voir DLL mélange export C et C++

    j'ai joué avec implib et tdump
    Avec un fichier IMPDEF, j'ai pu générer un fichier DEF pour retirer les décorations mais une DLL sans décoration m'a été fournie, je n'ai pas eu besoin de conserver cette bidouille

    le mieux pour le moment reste la génération du fichier LIB par ImpLib mais uniquement pour les fonctions exportées pas pour les classes

    le fichier LIB qui est différent entre MS et Borland,
    le fichier DEF qui n'est qu'un simple fichier texte, je sais que MS supporte ? dans le nom des fonctions mais pas BCB, j'ignorais que ce fichier pouvait contenir autre chose !
    MS ne respecte souvent pas les normes du C++ strict pas plus que BCB et chacun les siennes !

    Pour ce qui concerne des classes dans une DLL, j'ai tendance à considérer cela comme une mauvaise pratique pour de l'interopérabilité car compatible avec presque aucun langage, une DLL doit exporter des API avec des types bien défini (idéalement des types Windows) et au besoin des interfaces que l'on utiliserait presque comme du COM
    D'ailleurs, je ne pratique pas l'utilisation statique lui préférant LoadLibrary\GetProcAddress pour un meilleur contrôle du chemin, ne pas avoir une dépendance permanente mais juste ponctuelle sur un module, ...

    J'avais mémoire d'un sujet sur "classes C++ exportables" mais il était déjà de toi, cela ne semble pas fréquent comme demande !
    Toujours la même DLL ?
    Tu en es l'auteur ?
    Es-tu obligé d'utiliser cette DLL, tu n'as pas d'autres lib qui font la même chose mais plus "ouverte"

    Pourquoi ne pas faire une DLL Intermédiaire en Visual C++ qui encapsule cette classe dans un objet COM, cela t'éviterait toutes ces misères !

    A savoir que les BPL c'est justement la variante "classes Delphi exportables" utilisé dans C++Builder et les BPL sont strictement utilisables en Delphi\BCB de même version de compilateur
    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

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut
    Merci pour tes précisions ShaiLeTroll

    Je pense effectivement que nous allons passer par un objet COM, (ou ActiveX), encapsulant les classes désirées. Pour la DLL non, je ne suis pas l'auteur, mais j'ai le source, vu que c'est un projet "Open Source"

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    Est-ce que quelqu'un d'entre vous avez des liens expliquant comment utiliser un objet COM en C++ Builder XE2, SVP ? Je ne trouve pas grand chose sur le site d'Embarcadero.

    Merci par avance,

  8. #8
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Citation Envoyé par Mercusyo Voir le message
    Est-ce que quelqu'un d'entre vous avez des liens expliquant comment utiliser un objet COM en C++ Builder XE2, SVP ? Je ne trouve pas grand chose sur le site d'Embarcadero.
    Salut, j'imagine que tu as déjà regarder cette doc, mais je la post ici juste au cas... : Utilisation des contrôles ActiveX
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut
    Merci crayon pour le lien, je vais aller voir.

    De mon côté, j'ai trouvé le lien suivant : http://www.codeproject.com/Articles/...MatureApproach

    J'ai testé la partie "C++ Mature Approach: Using an Abstract Interface"; utilisant les principes de la technologie des objets COM, Le projet console sous C++ Builder XE2 compile et se lie correctement, par contre en exécution, j'ai "access violation" ...

    A suivre ...

  10. #10
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Je pensais que tu voulais faire du COM, mais en effet si tu utilise la technique des classes abstraites (similaire à COM) c'est plus facile.
    Je l'ai déja fait -pas avec X2, mais je ne vois pas pourquoi ça ne fonctionnarait pas avec X2.
    Je suis un peu perdu dans le code de CodeProject, il y a des tas d'autres exemple sur le web.
    Les points clés sont:
    - La gestion de __declspec(dllexport) dans la dll et __declspec(dllimport) dans ton exe
    - L'interface doit être typée cdecl, surtout pas cpp, ni stdcall
    - L'interface est abstraite
    - Elle mappe les méthodes publiques de la classe qui est exportée

    Le principe est que tu instancie la classe exportée à partir d'une fonction (qui appelle le new dans la dll). Tu as une autre fonction pour le delete.
    La fonction New renvoie une instance sur la classe abstraite, et tu peux ainsi accèder aux méthodes.

    Je te posterais bien un exemple mais je n'ai pas le projet sous la main.
    Dès que j'y pense, si j'y pense. Désolé.
    Motc lés goocgle: c++ export class interface dll

    Ce site est bien (pour la partie cpp, mais insuffisant pour le .h):
    http://eli.thegreenplace.net/2011/09...es-from-a-dll/
    Note dans le .h la fonction factory_func qui fait le new.

    Ce qui manque dans le .h c'est la partie sur cdecl pour que factory_func soit 100% compatible CBuilder, et aussi je crois dans la déclaration de l'interface.

    C'est quelque chose comme ça:
    http://stackoverflow.com/questions/1...s-platform-use

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut
    Ok merci yarp pour ces précisions, je regarde tout ça en détail ...

  12. #12
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Bonjour
    L'interface doit être typée cdecl, surtout pas cpp, ni stdcall
    cette affirmation est correcte dans le cas d'emploi d'interface

    par contre dans le cas fournis en exemple avec l'emploi de classe
    virtuelle
    on dois utiliser dans le cas de C++Builder le prefix _ stdcall


    le code de la dll devient donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    extern "C" __declspec(dllexport) IKlass* __stdcall create_klass()
    {
    	return new MyKlass;
     
    // dans le cpp de l'exe la déclaration de l'instance devient
    typedef IKlass* (__stdcall *iklass_factory)();
    dans le cas contraire l'instance de la classe exportée
    devient :_create_klass

    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 164
    Points : 85
    Points
    85
    Par défaut
    Bonjour à tous,

    Je reviens vers vous concernant mon souci. Nous avons décidé d'utiliser un objet COM de type ATL développé du coup sous Visual Studio 2010.

    Par contre, nous avons des problèmes de performance. Est-ce qu'il y a quelque chose de particulier à faire du côté Embarcadero pour "importer une bibliothèque de type" ?

    Merci par avance,

Discussions similaires

  1. [DLL] utiliser une DLL a partir d' une DLL et un .def
    Par venomelektro dans le forum MFC
    Réponses: 9
    Dernier message: 07/12/2004, 15h01
  2. utilisation de dll avec diverses compilateurs
    Par Thylia dans le forum C++
    Réponses: 30
    Dernier message: 21/10/2004, 17h30
  3. Utilisation de dll
    Par portu dans le forum Windows
    Réponses: 7
    Dernier message: 03/03/2004, 00h09
  4. Utilisation de dll
    Par David E dans le forum MFC
    Réponses: 11
    Dernier message: 04/02/2004, 15h09
  5. [CR] Infos sur l'utilisation de dll
    Par step dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 09/08/2002, 12h35

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