[BC6]Transfert instance de classe MySQL à une dll

Transfert instance de classe MySQL à une dll [BC6] - C++ - Programmation

Marsh Posté le 03-05-2004 à 21:29:42    

Bonjour,  
 
J'ai créé un petit programme avec Borland C++ 6 qui contient une petite classe de connexion à MySQL. Je l'utilise dans mon programme principal et ça fonctionne trés bien.  
Voulant fragmenter mon programme en plusieurs morceaux pour gérer une éventuelle évolution du programme, j'ai créé une dll qui affiche une fenêtre et qui doit réaliser une requête sur le serveur MySQL en utilisant l'instance de la classe MySQL créée dans mon programme principal.  
 
Voici comment cela se passe:  
 
Ma classe de connexion:  

Code :
  1. class PersoSQL
  2. {
  3. private:
  4.         MYSQL *mySQL; // Pointeur MySQL  
  5.         char *host,*user,*pass,*db;
  6.         MYSQL_RES *myRES;
  7. public:      // User declarations  
  8.         MYSQL_ROW myROW;
  9.         __fastcall PersoSQL()
  10.         {
  11.                 this->mySQL = mysql_init(NULL);
  12.                 this->host =  "localhost";
  13.                 this->user = "xxxxx";
  14.                 this->pass = "xxxxx";
  15.                 this->db = "xxxxx";
  16.         }
  17.         __fastcall ~PersoSQL()
  18.         {
  19.                 mysql_close(this->mySQL);
  20.         }
  21.         bool connect()
  22.         {
  23.                 if (!mysql_real_connect(this->mySQL, this->host, this->user, this->pass, this->db, 0, NULL, 0)){
  24.                         return false;
  25.                 }
  26.                 else
  27.                         return true;
  28.         }
  29.         int isconnect()
  30.         {
  31.                 //return((int) this->mySQL);  
  32.                 return(mysql_ping(this->mySQL));
  33.         }
  34.         MYSQL_RES* query(char *requete)
  35.         {
  36.                 if(!mysql_query(this->mySQL, requete)){
  37.                   this->myRES = mysql_store_result(this->mySQL);
  38.                     if(this->myRES)
  39.                       return (this->myRES);
  40.                     else
  41.                       return NULL;
  42.                 }
  43.                 else{
  44.                   ShowMessage(mysql_error(this->mySQL));
  45.                   return NULL;
  46.                 }
  47.         }
  48. };


 
Dans mon programme principal je déclare la fonction d'entrée de la dll:  

Code :
  1. extern "C"__declspec (dllimport) __stdcall int LoadAccueil(PersoSQL);


 
dans la création de la fenêtre principale:  

Code :
  1. perSQL = new PersoSQL; // je crée une instance de ma classe PersoSQL


 
code qui exécute la fonction de ma dll:  

Code :
  1. int a;
  2.         a = LoadAccueil(*perSQL);


 
dans ma dll:  
 

Code :
  1. #define __WIN__
  2. #include "mysql.h"
  3. #include "MySQL_class.h"
  4. #include "main_config.h"
  5. PersoSQL *MyConnect;
  6. extern "C" __declspec(dllexport) __stdcall int LoadAccueil(PersoSQL *SQL);
  7. #pragma argsused
  8. int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
  9. {
  10.         return 1;
  11. }
  12. //---------------------------------------------------------------------------  
  13. int __stdcall LoadAccueil(PersoSQL *SQL)
  14. {
  15.     TConfigForm *ConfigForm;
  16.     MyConnect = SQL;
  17.     ShowMessage(IntToStr(MyConnect->isconnect()));
  18.     return 1;
  19. }


 
 
Voilà, en fait donc lorsque je lance la fonction de ma requête, je demande un ping afin de savoir si mon instance de classe a bien été transmise et si je suis toujours connecté au serveur, mais j'ai ce message d'erreur:  
 

Citation :

Access violation at adress 1000D0C4 in module 'LIBMYSQL.DLL'. Read of adress 000000E8


 
 
J'ai essayé plein de choses mais rien à faire j'ai toujours cette satanée erreur et j'arrive à rien depuis longtemps, je suis bloqué.  
Si quelqu'un peu m'aider, ce serait vraiment sympa.  
 
Merci d'avance.

Reply

Marsh Posté le 03-05-2004 à 21:29:42   

Reply

Sujets relatifs:

Leave a Replay

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