begin process at 2012 05 29 19:12:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

Nettoyer une classe sans la detruire !!


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Nettoyer une classe sans la detruire !!

mercredi 30 juin 2004 à 18:18:21 | Nettoyer une classe sans la detruire !!

SnOOpss

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 !!!




jeudi 1 juillet 2004 à 12:04:11 | Re : Nettoyer une classe sans la detruire !!

vecchio56

Administrateur CodeS-SourceS
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.
jeudi 1 juillet 2004 à 19:07:31 | Re : Nettoyer une classe sans la detruire !!

SnOOpss

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 !!
samedi 3 juillet 2004 à 10:56:49 | Re : Nettoyer une classe sans la detruire !!

SnOOpss

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 ????
samedi 3 juillet 2004 à 11:48:31 | Re : Nettoyer une classe sans la detruire !!

vecchio56

Administrateur CodeS-SourceS
Tu as bien compilé principale.cpp?
samedi 3 juillet 2004 à 12:05:43 | Re : Nettoyer une classe sans la detruire !!

SnOOpss

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)
dimanche 4 juillet 2004 à 19:31:52 | Re : Nettoyer une classe sans la detruire !!

SnOOpss

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 !!


Cette discussion est classée dans : kill, classe, nettoyer, imgset, imageset


Répondre à ce message

Sujets en rapport avec ce message

ouverture de base Access [ par denis ] salut!voila mon probleme :j'ai cree une dll dans laquelle il y a une ouverture de base access au moyen d'une classe qui dérive de la classe CRecordset VCplusplus 6 [ par emaskaoui ] Comment je peux acceder au membre données d'une la classe à partir d'une autre classe? Merci dll pour asp avec connection odbc [ par denis ] salut!voila mon probleme :j'ai cree une dll dans laquelle il y a une ouverture de base access au moyen d'une classe qui dérive de la classe CRecordset Base de donées ADO [ par header ] Apres avoir importe la dll et tout ce qui faut pour qu'une classe générique de CADORecordBinding soit crée j'ai un problème : lorsque je commence mes AIDEZ MOI : LE DOWNLOAD AVEC la classe CHTMLVIEW [ par header ] il me faudrait un topo sur la classe CHtmlViewje ne sais pas comment faire une pause dans un telechargement...................AIDEZ MOI builder c++ 5 compile pas chez moi [ par ferrari ] voila j'ai un projet sous builder qui compilej'ai rajouter une classe perso mais lorsque je compile et que j'appelle une methode de ma classe, il me d Récupérer le Handle de l'appli [ par Stoomm ] Bonjour,Explication :J'ai une classe D3Dapp qui crée la fenetre.Dans une autre classe (qui va servir a D3Dapp), j'aimerais récupérer le handle de la f Visual c++ [ par Maxus ] Salut,j'ai un probleme sous visual c++ lorque j'execute une fonction d'une classe à partir d'une autre...Explication : dans une fenetre, j'ai une list INSTANCIER UNE CLASSE D'UNE DLL [ par KL ] Bonjour,J'ai un enorme problème !J'ai créé une DLL avec des classes dedansMaintenant je veux pouvoir importer ces classes dans un prog Win32 et pouvoi HELP ME C'est quoi une classe ? [ par Oceane ] salut,j'aurais besoin d'un petit coup de main. Je viens de commencer C++ et oui y un dédut à tout Je m'explique, j'ai un projet à faire pour mon exame


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,076 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales