Salut, j'ai un petit probleme.
Sous vc6, j'utilise une structure comme ceci
pour passer des messages inter proces ou autres par postmessage ou sendmessage, ainsi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 struct logmessage{ CString message; };
et dans le traitement je recupere le contenu en interceptant le message ainsi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 logmessage *log=new(logmessage); log->message="ERREUR, Numero de reference expediteur "+numeroexpe+" inconnu."; if (processedi!=NULL) processedi->PostMessage(MESSAGE_FRONTAL_EDI,(unsigned int)log,0L);
Le message passe tout va bien, sauf que lorsque je fais l'envoi, et donc l'allocation memoire de la structure depuis une dll, et la liberation de cette structure depuis une fonction du programme appellant, la, probleme d'exception memoire, impossible de faire le delete.
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 MSG msg; while (::PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if (msg.message==MESSAGE_FRONTAL_EDI) { logmessage *log; log=(logmessage*)msg.wParam; if (log!=NULL) { CString temp; globalprocess->m_processEDI_suivi.GetWindowText(temp); temp=temp+log->message+"\r\n"; globalprocess->m_processEDI_suivi.SetWindowText(temp); globalprocess->m_processEDI_suivi.Invalidate(); delete log; } } }
Etant donné que ca me sert pour faire le passage des messages d'erreurs vers une boite de dialogue non modale, je peux pas vraiment faire differement.
Mais ou est vraiment le probleme?
Je dois allouer ailleurs que sur le tas, ou ne pas désallouer.? comment faire.?
J'ai ca dans ma pile d'appels aprés l'exception,et ceci dans la fenetre de trace de debug.NTDLL! 7795475c()
NTDLL! 7791fad0()
NTDLL! 778b2dd4()
KERNELBASE! 75c8222f()
_CrtIsValidHeapPointer(const void * 0x02dc7228) line 1697
_free_dbg_lk(void * 0x02dc7228, int 1) line 1044 + 9 bytes
_free_dbg(void * 0x02dc7228, int 1) line 1001 + 13 bytes
operator delete(void * 0x02dc7228) line 351 + 11 bytes
CString::FreeData() line 146 + 15 bytes
CString::~CString() line 213
logmessage::~logmessage() + 37 bytes
logmessage::`scalar deleting destructor'(unsigned int 1) + 37 bytes
donc, la comment faire??HEAP[ulysse22.exe]: Invalid address specified to RtlValidateHeap( 01C50000, 02DC7208 )
Merci.
Partager