[C++] Plantage d'une dll [résolu]

Plantage d'une dll [résolu] [C++] - C++ - Programmation

Marsh Posté le 05-08-2004 à 13:50:07    

Ce code plante, mais si je rajoute un MessageBox juste après "res = pfn_RegisterServer();", il ne plante pas.
 
Quelqu'un a-til une idée, ce n'est pas très pratique le coup du messagebox...
 

Code :
  1. DllCOM::DllCOM(char * dll)
  2. {
  3.     hDLL = LoadLibrary(dll);
  4.    
  5.     if (hDLL < (HINSTANCE)HINSTANCE_ERROR)
  6.     {
  7.         char * buf;
  8.         sprintf(buf, "%s :\n\n\%s\n\n%s", ERR_LOAD_LIBRARY, dll, ERR_CONTACT);
  9.         MessageBox(NULL, buf, "Datagest DllCOM", MB_ICONSTOP);
  10.     }
  11.     else
  12.     {
  13.         pfn_RegisterServer = (DLL_Function_RegisterServer)GetProcAddress(hDLL, "DllRegisterServer" );
  14.         pfn_UnregisterServer = (DLL_Function_UnregisterServer)GetProcAddress(hDLL, "DllUnregisterServer" );
  15.         pfn_CanUnloadNow = (DLL_Function_CanUnloadNow)GetProcAddress(hDLL, "DllCanUnloadNow" );
  16.         pfn_GetClassObject = (DLL_Function_GetClassObject)GetProcAddress(hDLL, "DllGetClassObject" );
  17.        
  18.         HRESULT res;
  19.         res = pfn_RegisterServer();
  20.        
  21.         if (res != S_OK)
  22.         {
  23.             char * buf;
  24.             sprintf(buf, "%s\n\n%s", ERR_REGISTER, ERR_CONTACT);
  25.             MessageBox(NULL, buf, "Datagest DllCOM", MB_ICONSTOP);
  26.         }
  27.     }
  28. }


Message édité par fatypunk le 05-08-2004 à 16:05:46
Reply

Marsh Posté le 05-08-2004 à 13:50:07   

Reply

Marsh Posté le 05-08-2004 à 13:53:48    

             char * buf;  
              sprintf(buf, "%s :\n\n\%s\n\n%s", ERR_LOAD_LIBRARY, dll, ERR_CONTACT);  
 
                    char * buf;  
                    sprintf(buf, "%s\n\n%s", ERR_REGISTER, ERR_CONTACT);  
 
=> elle sont la tes erreurs ... je suppose que si ca plante apres, c parce que ta mémoire est corrompue ...
c'est une coincidence si une MessageBox empeche le plantage


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 05-08-2004 à 13:56:49    

BlackGoddess a écrit :

char * buf;  
              sprintf(buf, "%s :\n\n\%s\n\n%s", ERR_LOAD_LIBRARY, dll, ERR_CONTACT);  
 
                    char * buf;  
                    sprintf(buf, "%s\n\n%s", ERR_REGISTER, ERR_CONTACT);  
 
=> elle sont la tes erreurs ... je suppose que si ca plante apres, c parce que ta mémoire est corrompue ...
c'est une coincidence si une MessageBox empeche le plantage


 
Je ne vois pas ce qu'il y a de faux là-dedans... et si je commente ces deux bouts de code, ma dll plante quand même... (ma dll j'entend celle que j'écrit et qui utilise cette classe pas celle que cette classe appelle)


Message édité par fatypunk le 05-08-2004 à 13:59:59
Reply

Marsh Posté le 05-08-2004 à 13:59:35    

bin si tu as fait partout pareil, c sur qu'elle plante qd mm ...
tu as déclaré un pointeur, mais il pointe dans le vent.
sprintf attend de ton pointeur qu'il pointe vers une allocation valide.


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 05-08-2004 à 14:04:40    

BlackGoddess a écrit :

bin si tu as fait partout pareil, c sur qu'elle plante qd mm ...
tu as déclaré un pointeur, mais il pointe dans le vent.
sprintf attend de ton pointeur qu'il pointe vers une allocation valide.


 
non c'est les seules... et c'est juste il me semble. Tout comme tu peux écrire :
 
const char* str="untruc";
 
En plus elle fonctionne si je provoque les erreur en question les MessageBox contiennent le bon message.

Reply

Marsh Posté le 05-08-2004 à 14:08:21    

en c++ :
 

Code :
  1. #include <sstream>
  2. std::ostreamstring oss;
  3. oss << ERR_LOAD_LIBRARY << "\n\n" << dll << "\n\n" << ERR_CONTACT;
  4. MessageBox(NULL, oss.str().c_str(), "Datagest DllCOM", MB_ICONSTOP);


 
ou
 

Code :
  1. #include <string>
  2. MessageBox(NULL, oss.str().c_str(), "Datagest DllCOM", MB_ICONSTOP);
  3. std::string buf(ERR_LOAD_LIBRARY);
  4. buf += "\n\n";
  5. buf += dll;
  6. buf += "\n\n";
  7. buf += ERR_CONTACT;
  8. MessageBox(NULL, buf.c_str(), "Datagest DllCOM", MB_ICONSTOP);



---------------
-( BlackGoddess )-
Reply

Marsh Posté le 05-08-2004 à 14:11:01    

const char* str="untruc";
=> rien à voir :o
 
Taz va faire une attaque :/
 
sprintf attend un buffer alloué ...
const char* str="untruc"; est une initalisation d'un pointeur vers une chaine 'statique' ...
 
et sprintf c'est du C, ici c'est C++


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 05-08-2004 à 14:13:44    


 
Excuse-moi je suis fatigué c'était évident en y réfléchissant...
 
Là j'ai mis un "char buf[256];", ca marche aussi mais comme je fait du c++ je devrais utiliser les opérateurs de flux.
 
Merci encore...


Message édité par fatypunk le 05-08-2004 à 14:15:42
Reply

Marsh Posté le 05-08-2004 à 14:14:34    

exactement :) (pas spécialement les opérateurs de flux, mais au moins les libs du C++ et pas celles du C)
 
de rien


Message édité par blackgoddess le 05-08-2004 à 14:15:24

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 05-08-2004 à 14:14:40    

BlackGoddess a écrit :

const char* str="untruc";
=> rien à voir :o
 
Taz va faire une attaque :/
 
sprintf attend un buffer alloué ...
const char* str="untruc"; est une initalisation d'un pointeur vers une chaine 'statique' ...
 
et sprintf c'est du C, ici c'est C++


 
 :jap:  
 
C'est bon je sors...

Reply

Sujets relatifs:

Leave a Replay

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