MFC Cmenu Klasse instabil im Terminalserver?

codeguru

nicht mehr wegzudenken
Hallo Forum, hier ein kleines Problemche..... ich debugge gerade eine Anwendung deren Oberfläche Gebrauch von der CMenu Klasse aus der MFC macht. Man klickt mit der rechten Maustaste auf ein Dokument das gerade offen ist, und der Message Handler ruft dann meine Komponente auf die das Menü zeichnet.

CMenu ist eigentlich generisch, gibts auch unter Linux als X11 Funktion, ist sogar in Java implementiert... sprich, total langweiliger, uralter, millionenfach durchgesehener Programmcode.

Meine Komponente wird mit Visual Studio 6.0 SP6 entwickelt, das geht derzeit auch nicht anders.

Mein Problemche besteht darin, daß das Aufpoppen eines Submenüs mit seltsamen Debug Assertions hängt, wenn
1.) extrem wenig ARbeitsspeicher verfügbar ist
2.) die Anwendung auf einem Terminalserver läuft bzw. in einer Terminal Session

Ich hab schon alles nachkontrolliert - alle Parameter sind gültig, der Pointer zum Menü ist gültig, und trotzdem krieg ich "second chance assertion failed in cmdtarg.cpp line 52" - das ist ne Datei vom Visual Studio und enthält so ein paar Klassendefinitionen die ich mangels detaillierter MFC Kenntnisse nicht ganz deuten kann, der zugehörige Code sieht so aus:

CCmdTarget::~CCmdTarget()
{
#ifndef _AFX_NO_OLE_SUPPORT
if (m_xDispatch.m_vtbl != 0)
((COleDispatchImpl*)&m_xDispatch)->Disconnect();
ASSERT(m_dwRef <= 1);////////hier knallt es!!!! Das ist Zeile 52
#endif
#ifdef _AFXDLL
m_pModuleState = NULL;
#endif
}
 
habs jetzt rausgefunden, mein Aufruf ist beispielsweise dieser:

bla(CMenu* pPopupMenu)
{
int a=pPopupMenu->GetMenuItemCount();
if(a>0) {irgendeinCode;}
}

Der Code wird über einen Messagehandler aufgerufen, da steht im Switch in etwa sowas harmloses drin:
case WM_IRGENDWAS: bla(pMenuPointer); break;

Das geht dann in meine bla() Funktion rein

die wiederum läuft im Degugmode in mfc\include\afxwin1.inl rein, dort gibts wiederum ein _ASSERT:):IsMenu(m_hMenu)); return ::GetMenuItemCount(m_hMenu);

Das setzt nun mal vorraus, daß pPopupMenu->m_hMenu ein gültiges Menühandle enthält. Ansonsten knallt es.... warum ein aufgebautes Menü ein ungültiges m_hMenu enthalten kann das bei IsMenu(m_hMenu) ein false liefert.... ist mir ein Rätsel das wohl irgendwo in der MFC42.dll vergraben ist
 
Oben