Zusammengesteztes Steuerelement in einem Zusammengestezten Steuerelement
-
Ich habe ein großes Problem mit zusammengesetzten Steuerelementen (CComCompositeControl) in Visual C++ 6.0.
Ich habe ein zusammengesetztes Steuerelement (CComCompositeControl) in einem zusammengesetzten Steuerelement (CComCompositeControl) und dieses dann in einen Dialog von einem Exe-Programm eingebunden. Bei jedem Öffnen und Schließen des Dialogs erhöht sich die Anzahl der User-Objects unter Windows. Da diese vom System auf 10000 beschränkt sind, kommt es nach der Überschreitung dieser Grenze zu einem Programmabsturz. Ich habe den gleichen Aufbau auch schon in VB ausprobiert, da gab es keine Probleme mit der Anzahl der User-Objects. In Vb wurden nach dem Schließen des Dialogs alle User-Objects wieder freigegeben.Dieser Fehler ist auch sehr einfach zu reproduzieren. Man erstellt einfach zwei zusammengesetzte Steuerelmente mit visual C++. Bindet das eine in das andere ein und erzeugt dieses in einem Dialog von einem Exe-Programm. Wobei es keine Rolle spielt, ob die Exe in VB oder mit Visual C++ erstellt worden ist.
Kennt jemand dieses Problem und hat auch eine Lösung dafür?
-
Wie entsorgst Du das ganze wieder?
-
Das ist ja genau die Frage. Im Moment wird einfach der Dialog geschlossen ohne explizit das Objekt noch einmal zu zerstören. Wenn nur ein zusammengesetztes Steuerelemnt, das nicht wieder ein zusammengesetztes Steuerelement beinhaltet benutze, dann funktioniert es ja. Muß ich denn das Steuerelement, welches sich in dem Steuerelement befidnet, irgendwie wieder zerstören? Wen ja, weißt du wie? Eigentlich sind wir davon ausgegeangen, das die MFC das übenimmt.
Man kann das sehr einfach nachvollziehen. Einfach mit Visual Studio zwei zusammengesetzte Steuerelement erzeugen. Dann das erste Steuerelement in das zweite einbinden und dann das zweite in einem dialogbasierenden Projekt einbinden und einfach auf den Dialog ziehen. Dazu dann eine Schaltfläche mit der man dann einfach den Dialog immer wieder auf und zu machen kann. Nach jedem Schließen, wächst die Anzahl der User-Objekte im Task-Manager an. Wird dann die Anzahl von 10000 überschritten, steigt das Programm aus.
-
Hast Du ein fertiges Sample. Schick es mal...
-
Ich würde Dir gerne ein Beispiel schicken, aber leider hast du in deinem Profil keine Email-Adresse angegeben. Oder gibt es in diesem Forum noch eine andere Möglichkeit Dateien zu verschicken?
-
Das Problem besteht nur, wenn bei der Erstellung der Projekte für die zusammengestezten Steuerelemente die MFC-Unterstützung aktiviert worden ist. Wahrscheinlich muß bei der Erzeugung der Steuerelement über die MFC das eingebettete Steuerelement zusätzlich freigegeben werden. Stellt sich jetzt nur die Frage, wie?
-
Es hat nichts mit der Mfc zu tun!!!!!!!
Mein Kollege hatte beim testen einen Fehler gemacht. Er hatte das Formular beim schließen nicht entladen und dabei wurde nicht ein neues Formular erstellt, sondern das Alte wieder geöffnet. Also sind wir wieder dort, wo wir angefangen haben. Trotzdem glaube ich, dass man nur das erzeugte Control irgendwie wieder explizit freigeben muß. Ich weiß nur nicht wie!
-
Für das eingebete Element habt Ihr doch ein Objekt in dem Dialog.
Wie steht es mit einem simplen Release?
-
Auch bei einem simplen Release werden die User-Objects nicht freigegeben. Wie kann ich Dir denn jetzt mal ein Beispiel schicken?
-
MSDN KB Article Q258235 "BUG: Memory Leak with ATL Containment".
Zusätzlich sollte man noch beachten:
if(m_hAccel == NULL)
m_hAccel = CreateAcceleratorTable(&ac, 1);pFrameInfo->haccel = m_hAccel;
pFrameInfo->cAccelEntries = (m_hAccel!= NULL) ? 1 : 0;---------
-
Schulte schrieb:
Auch bei einem simplen Release werden die User-Objects nicht freigegeben. Wie kann ich Dir denn jetzt mal ein Beispiel schicken?
Über mein Benutzer Profil...