Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2112 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Probleme pour utiliser une DLL sous BCB

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme pour utiliser une DLL sous BCB

n°884713
juldjin
Posté le 28-10-2004 à 10:50:32  profilanswer
 

Bonjour, depuis plusieurs moi je réalise des DLLs qui sont compatible sous VC++ et BCB. Je les crée sous VC++ et je transforme le .lib avec COFF2OMF. Tout marchais bien jusqu'au jour ou j'ai décidé de ne plus exporter des fonctions (en extern "C" ), mais l'interface d'un objet.
 
Pour cela je crée le .h que je livre avec ma library  
 
class Titi_interface
{
public :
   virtual void fonction1() = 0;
   virtual void fonction2() = 0;
}
 
extern "C" __declspec(dllexport) void* QueryObject();
 
La fonction QueryObject est faite comme ça :
void* QueryObject() { return(new Titi) };
 
et dans l'implémentation de la library je réalise la classe Titi :
 
class Titi : public Titi_interface
{
   void fonction1();
   void fonction2();
}
 
Du coup l'utilisateur utilise mon programme comme ça :
Titi_interface *T;
T = (Titi_interface *) QueryObject();
T->fonction1();
 
Il n'a pas acces à la classe Titi c'est un peu comme avec COM/COM+ je crois.
 
Le truc c'est qu'avec VC++ ma DLL marche nickel, mais avec BCB c'est le gros bazar, les arguments que je passe aux fonctions membres ne sont pas ce que je reçois dans ma DLL, j'ai plein d'erreur d'acces...
 
Quelqu'un aurait il une idée ?
 
Je me demande si s'est pas une histoire de stcall ou un truc du genre. J'avais réalisé de la meme maniere une Bibliotheque sour BCB et ça marchait tres bien sous BCB...

mood
Publicité
Posté le 28-10-2004 à 10:50:32  profilanswer
 

n°884875
Lam's
Profil: bas.
Posté le 28-10-2004 à 14:47:33  profilanswer
 

Ca remonte à loin tout ça pour moi.  
 
Mais en gros, il faut que Visual C++ et Borland utilisent la même convention d'appel (stdcall par exemple). C'est d'ailleurs ce que tu fais implicitement je crois en préfixant ton QueryObject d'un declspec(dllexport).  
 
Or, par défaut, l'un des deux utilisera thiscall, c'est à dire qu'il met le pointeur this dans un registre plutôt que dans la pile.
 
Le problème, c'est que je n'ai aucune idée du comment-faire pour changer tout ça. Cherche le web, ou demande éventuellement à antp...

n°884911
HelloWorld
Salut tout le monde!
Posté le 28-10-2004 à 15:03:16  profilanswer
 

Je crois que c'est plutot un probleme de name mangling qui est différent entre les 2 compilos.
http://www.cppbuilderdevjournal.co [...] _a_DLL.htm


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°884954
Lam's
Profil: bas.
Posté le 28-10-2004 à 15:25:04  profilanswer
 

Oui, c'est pour ça (entre autres) qu'il passe par une interface anonyme (comme le montre très bien ton lien dans le Listing A).  
 
Mais ça n'explique pas pourquoi il se choppe plein de paramètres dans le vent.

n°884971
HelloWorld
Salut tout le monde!
Posté le 28-10-2004 à 15:37:56  profilanswer
 

Il me semble que VC++ encode (lors du name mangling) une convention d'appel d'une manière que BCB décode comme une autre (une histoire de _ devant si j'ai bonne mémoire)...
Rappelez moi le but des dll ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°884974
Lam's
Profil: bas.
Posté le 28-10-2004 à 15:41:39  profilanswer
 

HelloWorld a écrit :

Il me semble que VC++ encode (lors du name mangling) une convention d'appel d'une manière que BCB décode comme une autre (une histoire de _ devant si j'ai bonne mémoire)...
Rappelez moi le but des dll ?


Yup, c'est la différence entre stdcall et fastcall que tu nous donne là en terme de mangling (et encore, il y a juste le _ du début. On est loins des incompatibilités de C++ sous unix).  
 
Sinon, pour les DLL, c'est triste à dire et ce n'est pas un glorieux standard, mais COM est quand même un super modèle pour faire coexister des composants hétérogènes. Surtout que BCB est capable de les importer comme sa poche...
 

n°885025
juldjin
Posté le 28-10-2004 à 16:17:24  profilanswer
 

Bon en demandant au compilo de décoré avec __cdecl comme ça :
 
class Titi_interface  
{  
public :  
   virtual void __cdecl fonction1() = 0;  
   virtual void __cdecl fonction2() = 0;  
}
 
Ca marche sous BCB nickel, mais plus sous VC++  :sarcastic:  
 
Vous pensez qu'il faut que je mette en place des directives de compilation pour pouvoir compiler en __cdecl pour BCB et en __stdcall, ou y'a un autre moyen plus simple ?
 
Sinon est ce que je peux rajouter une configuration a mon projet du genre Release BCB, et joué sur une variable d'état que je lit dans mon prog avec des directives de compilation du style :
 
#ifdef __RELEASE__BCB
  #define DLLEXPORT __cdecl
#else
  #define DLLEXPORT __stdcall
#endif
 
Mais dans ce cas la je sais pas comment on fait pour créer __RELEASE__BCB automatiquement.. dans les arguments du compilo ?

n°885160
HelloWorld
Salut tout le monde!
Posté le 28-10-2004 à 18:00:22  profilanswer
 

Ca me parrait très bancal...  

Citation :

Bonjour, depuis plusieurs moi je réalise des DLLs qui sont compatible sous VC++ et BCB. Je les crée sous VC++ et je transforme le .lib avec COFF2OMF.


Compile 2 fois ta dll et livre les 2 versions...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°889022
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-11-2004 à 23:05:20  profilanswer
 

bon allez, je file la solution :o
sous C++ Builder, tu restes en __declspec, et tu créé un fichier .def que tu ajoutes à ton projet, dans le genre :
 

Citation :


LIBRARY tadll.dll
 
EXPORTS  
fonction1 = _fonction1
fonction2 = _fonction2


et basta, la dll sera lisible par n'importe quel exe créé avec VC++ (fonctionne pour moi pour une dll créé avec BCB et relue par Winamp, pour un plugin) :o


Message édité par Harkonnen le 02-11-2004 à 23:07:15

---------------
J'ai un string dans l'array (Paris Hilton)

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Probleme pour utiliser une DLL sous BCB

 

Sujets relatifs
[CSS ] probleme sur balises Li // résoludll lockée
problème avec rand()Probleme de taille de bouton sur PDA avec WinCE4.2
[C] Problème de librairie ...Probleme d'apostrophe.
Probleme de numeroAutoReseau Socket - Problème de bind() dans un client/serveur local
Problème avec la fonction MoveFile [Résolu]régénérer le .lib pour la DLL
Plus de sujets relatifs à : Probleme pour utiliser une DLL sous BCB


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR