Nettoyer une classe sans la detruire !!

Signaler
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Bonjour tout le monde et désolé de mettre un sujet si vague mais je voit pas coment expliquer. Voila je me sert de la librairie winimage pour afficher des gifs. C dans une dll ki se charge en memoire et ki y reste dés le premier appel par l'executable ( c Mirc )

class C_ImageSet {

[....]
void kill();             // detruit

// constructor and destructor:
C_ImageSet() {img=0; nImages=0; nLoops=0;}
~C_ImageSet() {for (int n=0;n<nImages;n++) delete img[n]; delete[] img;}
}


void C_ImageSet::kill()
{
    for (int n=0;n<nImages;n++) delete img[n]; delete[] img;
}

( la partie kill est de moi pour tester )

En fait au demarrage de ma dll j'ai en tete pas dans la fonction
C_AnimationWindow gif[0xFFFF];
C_ImageSet imgset[0xFFFF];;
puis dans la fonction

        //recherche une place libre pour le gif
int hgif = 0;
while ( (gif[hgif].m_hWnd != NULL ) && ( ::IsWindow(gif[hgif].m_hWnd) ) ) hgif++;
if (hgif >= 0xFFFF) { wsprintf(data,"FULL"); return 3; }

imgset[hgif].kill();



Le probleme c que ma ligne imgset[hgif].kill(); ne marche qu'une fois ( alor kil n ya rien a effacer ) et plante completement au second coup )

Je ne peux pas utliser delete imgset[] car la dll pe afficher une autre gif pendant que j'ai besoin d'en nettoyer une.
Autre probleme : kan jafiche une gif je voit la gif que g chargé mais précédé de la precedente chargé. Il me faut a tout prix vider la classe !!
g essayé imgset[hgif] = NULL; refusé par le compilateur !!!

6 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu es sur que ce ne serait pas une meilleure solution d'utiliser des listes chainées plutot qu'un tableau pour imgset.
Pour ton problème, il manque quelques informations (qu'est ce que C_ImageSet::img?), mais de toute manière difficile de trouver le problème avec des information fragmentaires comme tu donnes.
Tu devrais pouvoir trouver le problème en debuggant pas à pas.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Ben en fait g po mit trop de details a cause de la longueur du code

class C_ImageSet {
public:
int FrameWidth, FrameHeight;	// Dimensions of ImageSet in pixels.
int nLoops;						// Number of Loops (0 = infinite)

C_Image ** img;				// Images' Vector.
int nImages;					// Number of images (vector size)

void AddImage (C_Image*);		// Append new image to vector (push_back)
void kill();                                                 // detruit

// constructor and destructor:
C_ImageSet() {img=0; nImages=0; nLoops=0;}
~C_ImageSet() {for (int n=0;n<nImages;n++) delete img[n]; delete[] img;}

// File Formats:
int LoadGIF (char* szFile);
int SaveGIF (char* szFile) {return 0;};	// NOT IMPLEMENTED
};

#define DEFAULT_CLASSNAME "AnimationWindow"

class C_AnimationWindow {
protected:
HANDLE hThreadAnim;			// Thread Handle
DWORD dwThreadIdAnim;		// Thread Identifier
public:
HWND m_hWnd;				// Window Handle
C_ImageSet * pAnimation;	// Pointer to Animation Raster Information
int CurrentImage;			// Current Image being displayed
int CurrentLoop;			// Current Loop in animation
BOOL bAnimationPlaying;		// TRUE when animation is playing.

// CLASS FUNCTIONS: (not object functions!)
static LRESULT CALLBACK WndProc (HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam);
static DWORD WINAPI fnThread (LPVOID lpParameter);

// Animation control:
void Play();				// Starts/Resumes animation
void Stop();				// Stops(Pauses) animation (without rewinding)
void Rewind();				// Rewinds animation (without stopping)

// Paints current image of animation:
void Paint (HDC hdc);

// WIN32 WRAPPING FUNCTIONS:
// Create a new Window (initially hidden, call Display to display):
HWND Create (HWND hwndParent, HMENU id, C_ImageSet * imageset,
DWORD dwStyle=WS_CHILD, char* szClassName=DEFAULT_CLASSNAME);
// Display Window at specified location (x&y= upper-left corner)
BOOL Display (int x, int y);

// You may redefine the following windows' message processing function
// in a derived class to implement a different behavior:
virtual LRESULT Message (UINT iMsg,WPARAM wParam, LPARAM lParam);
};


Par contre dsl d'etre lourd mais si tu connaissait un site qui expliquerait comment debogger une dll (VC++ ou borland ) ca m'aiderait sinon la je vais voir ce que sont les listes chainées !!
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Ca yé g fait avec les liste chainées mais maintenant g un probleme de linkage !!

dans la source principale.cpp


struct Element
{

    C_AnimationWindow gif;
    C_ImageSet imgset;

    Element* suivant;

};

void Ajouter(char *fichier,int x,int y,HWND hwnd)
{

    Element* element= new Element;
 
    element->imgset.LoadGIF(fichier);
    element->gif.Create(hwnd,NULL,&element->imgset);
    element->gif.Display(x,y);

    element->suivant = liste;
    liste = element;
}

void Netoyemem(HWND m_hWnd) {

    Element* element = liste;
 
    while(element != NULL && element->gif.m_hWnd != m_hWnd)

        element = element->suivant;

    if (element != NULL) Supprimer(element);

}



et dans gif.cpp


void Netoyemem(HWND);

LRESULT C_AnimationWindow::Message (UINT iMsg,WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch (iMsg)
{

[....]

case WM_DESTROY:
Stop();
                Netoyemem(m_hWnd);
return 0;
}
return DefWindowProc (m_hWnd,iMsg,wParam,lParam);
}



Et j'ai le message d'erreur
error LNK2001: unresolved external symbol "void __cdecl Netoyemem(struct HWND__ *)" (?Netoyemem@@YAXPAUHWND__@@@Z)
Release/NemeSiS.dll : fatal error LNK1120: 1 unresolved externals

Qu est ce ke j'ai pu oublier ????
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu as bien compilé principale.cpp?
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Oui oui j'en suis sur , j'ai ca en fait !!

Compiling...
principale.cpp
gif.cpp
Linking...
Creating library Release/NemeSiS.lib and object Release/NemeSiS.exp
NemeSiS.exp : warning LNK4070: /OUT:tmp.dll directive in .EXP differs from output filename "Release/NemeSiS.dll"; ignoring directive
gif.obj : error LNK2001: unresolved external symbol "void __cdecl Netoyemem(struct HWND__ *)" (?Netoyemem@@YAXPAUHWND__@@@Z)
Release/NemeSiS.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

NemeSiS.dll - 2 error(s), 1 warning(s)
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

G laissé tomber je n utlise plus kune seula variable mais g toujour le meme probleme comen la detruire et la refaire

C_AnimationWindow gif;
C_ImageSet imgset;

int __stdcall AffGif(HWND mWnd,HWND,char *data,char*,BOOL,BOOL)
{

        //reset de gif et imgset
        delete gif
        delete imgset;

        //initialisation de gif et imgset

//fonction
}


me donne un message d'erreur mais de toute facon ce ne serait pas bon vu ke juste apres les delete il me fo recreer les variables pour un deuxieme appel par exemple !!