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,
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,
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 ...
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 ...
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
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"
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,
Salut, j'imagine que tu as déjà regarder cette doc, mais je la post ici juste au cas... : Utilisation des contrôles ActiveX
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 ...
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
Ok merci yarp pour ces précisions, je regarde tout ça en détail ...
Bonjour
cette affirmation est correcte dans le cas d'emploi d'interfaceL'interface doit être typée cdecl, surtout pas cpp, ni stdcall
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
dans le cas contraire l'instance de la classe exportée
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)();
devient :_create_klass
cordialement
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,
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager