IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Memory Leak dans DLL


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 31
    Par défaut Memory Leak dans DLL
    Bonjour,

    J'ai un probleme de mémoire avec le code de ma DLL ci-dessous, mais je ne trouve pas où il se situe... En fait c'est une DLL appelée via un javascript depuis un gadget windows. Et lors de l'appel à la DLL le debogger de visual studio me met une erreur de mémoire.

    A priori ca vient du sprintf car des que je l'utilise ca me met des erreurs, sinon il n'y en a pas...

    Si vous avez une idée

    Merci de votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    STDMETHODIMP CclsDLLMSN::SendMessageMSN(BSTR m_strMessage, SHORT show)
    {
    		HWND msnui = NULL;
    		COPYDATASTRUCT msndata;
     
    		// ASCII
    		char Title[256];
    		memset(Title,'\0',sizeof(Title));
     
    		unsigned long length = WideCharToMultiByte (CP_ACP,0, m_strMessage,SysStringLen(m_strMessage), NULL, 0,NULL, NULL);
    		char* strRet = new char[length];
    		length = WideCharToMultiByte (CP_ACP,0, m_strMessage,SysStringLen(m_strMessage), reinterpret_cast <char *>(strRet), length,NULL, NULL);
    		strRet[length] = '\0';
    			sprintf(Title,"\\0Music\\0%i\\0{0}\\0%s\\0\\0\\0\\0\0",show,strRet);
     
     
    		// UTF16
    		WCHAR wstrTitle[256];
    		memset(wstrTitle, 0, sizeof(CHAR)*256);
     
    		// Conversion ASCII vers UTF16
    		int nLen = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)Title, -1, NULL, NULL);
    		MultiByteToWideChar(CP_ACP, 0, (LPCSTR)Title, -1, (LPWSTR)wstrTitle, nLen);
    		msndata.dwData = 0x547;
    		msndata.lpData = (void*)wstrTitle;
    		msndata.cbData = (nLen*2)+2;
     
    		do
    		{
    			USES_CONVERSION;
    			msnui = ::FindWindowEx(NULL, msnui,A2W("MsnMsgrUIManager"), NULL);
    			if (msnui != NULL)
    				::SendMessage(msnui, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&msndata);
    		}while(msnui !=NULL);
    		delete strRet;
    		return S_OK;
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    1. Pas de "m_" pour une variable qui n'est pas une variable membre.
    2. Tu alloues length caractères, mais tu places un caractère nul en length+1ième position...
    3. Tu n'as aucun moyen d'être sûr que ton sprintf() ne débordera pas du buffer title. Tu dois l'allouer dynamiquement également.
    4. Je ne suis pas sûr que les casts explcites de title et wstrTitle servent à grand-chose...
    5. D'une part, ce n'est pas A2W qu'il faut utiliser mais A2T. D'autre part, pourquoi utiliser une conversion run-time plutôt que d'utiliser tout simplement la macro _T() ou TEXT() ?
    6. Ta boucle do-while() ne risque-t-elle pas de partir en boucle infinie active si on ne démarre jamais MSN ?
    7. Utiliser delete[] au lieu de delete...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 31
    Par défaut
    MErci beaucoup beaucoup beaucoup j'ai résolu mon problème grace à tes commentaires

    Super ! a +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tesselation] Memory leak dans la combine Callback?
    Par ShevchenKik dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/07/2009, 11h21
  2. Réponses: 2
    Dernier message: 08/03/2009, 11h09
  3. Memory Leak d'une application dans Glassfish
    Par flepretre dans le forum Glassfish et Payara
    Réponses: 1
    Dernier message: 24/04/2008, 13h46
  4. [MFC] A la chasse au memory leak
    Par Yabo dans le forum MFC
    Réponses: 17
    Dernier message: 27/06/2004, 17h35
  5. Réponses: 7
    Dernier message: 26/02/2004, 09h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo