Probleme pour utiliser une DLL sous BCB

Probleme pour utiliser une DLL sous BCB - C++ - Programmation

Marsh Posté le 28-10-2004 à 10:50:32    

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...

Reply

Marsh Posté le 28-10-2004 à 10:50:32   

Reply

Marsh Posté le 28-10-2004 à 14:47:33    

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...

Reply

Marsh Posté le 28-10-2004 à 15:03:16    

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
Reply

Marsh Posté le 28-10-2004 à 15:25:04    

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.

Reply

Marsh Posté le 28-10-2004 à 15:37:56    

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
Reply

Marsh Posté le 28-10-2004 à 15:41:39    

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...
 

Reply

Marsh Posté le 28-10-2004 à 16:17:24    

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 ?

Reply

Marsh Posté le 28-10-2004 à 18:00:22    

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
Reply

Marsh Posté le 02-11-2004 à 23:05:20    

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)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed