Erreur suite à la création d'une DLL

Erreur suite à la création d'une DLL - C++ - Programmation

Marsh Posté le 09-06-2009 à 14:51:00    

Bonjour à tous.

 

Je suis bloqué sur un petit problème depuis ce matin... Je me tourne finalement vers vous pour connaitre votre avis.
Je vais essayer d'être le plus clair possible :
Voilà mes fichiers:

Code :
  1. // fichier base.hpp
  2. namespace core {
  3. [...]
  4.     class Base{
  5.     public:
  6.         virtual bool Init( wstring& filename ) =0;
  7.     };
  8. [...]
  9. }


Code :
  1. //fichier derive.dll
  2. #include "base.hpp"
  3. using namespace core;
  4. [...]
  5. class Derive : public Base {
  6. public:
  7.     virtual bool Init( wstring& filename ) {
  8.     wcout << filename << endl;
  9.     }
  10. };
  11. extern "C" __declspec(dllexport) Base* _stdcall create() {
  12.     Derive* newObject = new Derive;
  13.     return newObject;
  14. }


Code :
  1. // main.cpp
  2. [...]
  3. #include "base.hpp"
  4. using namespace core;
  5. extern "C" __declspec(dllimport) Base* __stdcall create();
  6. int main (...) {
  7.     Base* object = create();  // Jusque là ça marche
  8.     object.Init(L"TEST" );      // TEST devrait être affiché
  9. }
 

Après debug, je découvre que filename est un <Bad ptr> mais alors je ne sais pas comment ça se fait...
Si quelqu'un a une idée je suis preneur :)

 

Merci de m'avoir lu !

 


EDIT : J'ai oublié de préciser que le code marchait parfaitement avant le passage de derive.h et derive.cpp en derive.dll :)


Message édité par Arry le 10-06-2009 à 13:05:28

---------------
Mon Feed-Back
Reply

Marsh Posté le 09-06-2009 à 14:51:00   

Reply

Marsh Posté le 10-06-2009 à 10:04:27    

Après de nouveau test, si je passe en argument dans object.Init(  ) un pointeur sur des char, ça fonctionne.
En fait, tant que je passe en argument un type de variable connu en C, ça fonctionne.

 

Le soucis est maintenant décalé à ceci :

Code :
  1. //fichier derive.dll
  2. #include "base.hpp"
  3. using namespace core;
  4. class Derive : public Base {
  5. private:
  6.     char* buffer;
  7. public:
  8.     virtual bool Init( char* filename ) {
  9.         cout << filename << endl;
  10.         this->buffer = new char[640*480];  // à ce moment là le pointeur est bien alloué,
  11.                                            // cependant si je veux l'utiliser
  12.                                            // dans une autre fonction de la classe
  13.                                            // le debugueur le voit comme NULL.
  14.     }
  15. };
  16. extern "C" __declspec(dllexport) Base* _stdcall create() {
  17.     Derive* newObject = new Derive;
  18.     return newObject;
  19. }
 

Merci de m'avoir lu ! :)


Message édité par Arry le 10-06-2009 à 13:05:47

---------------
Mon Feed-Back
Reply

Marsh Posté le 10-06-2009 à 11:54:31    

Derive newObject = new Derive;

 

tu sais que tu es pas en java hein, cette ligne, et toutes ces semblables est fausse.

 

Derive* newObject = new Derive;

 

est correct


Message édité par Joel F le 10-06-2009 à 11:54:45
Reply

Marsh Posté le 10-06-2009 à 13:04:26    

Pardon, erreur de frappe lors de l'écriture de l'exemple.
Le pointeur est bien définit comme tu l'as décris dans mon code

 

edit : c'est corrigé dans les exemples.


Message édité par Arry le 10-06-2009 à 13:06:49

---------------
Mon Feed-Back
Reply

Marsh Posté le 10-06-2009 à 13:53:53    

ok :jap:
 
de mémoire je me demadne is on peut passer des objets ou des pointeurs d'objets à des fonctions extern "C". Cela expliquerai peut etre ceci

Reply

Marsh Posté le 10-06-2009 à 18:20:54    

J'ai changer mon mode de passage en DLL : j'utilise maintenant un .def comprenant une table d'export de fonctions.

 

Mon code fonctionne maintenant parfaitement :)

 

Merci pour tes indications ! :jap:


Message édité par Arry le 10-06-2009 à 18:21:53

---------------
Mon Feed-Back
Reply

Sujets relatifs:

Leave a Replay

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