jokey2
Erfahrenes Mitglied
Hallo Gemeinde!
Folgendes Problem:
Wenn ich meine MFC-Applikation starte und als Programmargument einen Dateinamen angebe, dann versucht das MFC-Framework die Datei in ProcessShellCommand zu öffnen. Wenn das allerdings fehlschlägt, z.B. weil es die angegebene Datei nicht gibt, dann beendet sich die Anwendung wieder kommentarlos und das mit IMPLEMENT_DYNCREATE erzeugte CDocument wird nicht wieder zerstört. Die Folge: ein Speicherleck!
Das kann ja eigentlich nicht sein, oder? Ich erzeuge das Dokument ja nicht selber, sondern es wird vom Framewürg erzeugt. Dann sollte das Framewürg es doch auch wieder zerstören, oder?
Ich habe mir jetzt erstmal so beholfen, daß ich sowohl das CDocument als auch den MainFrame vor dem Aufruf von ProcessShellCommand selber erzeuge. Dadurch habe ich einen Zeiger auf das Dokument, den ich deleten kann, wenn das ProcessShellCommand FALSE zurückliefert, bzw. setze ich dann den 'm_nShellCommand' Parameter von 'CCommandLineInfo' auf 'FileNew' und lasse ProcessShellCommand so nochmal laufen. Dadurch wird die Applikation eben nicht einfach kommentarlos geschlossen sondern sie wird mit einem leeren Dokument geöffnet. So kann ich auch noch eine Meldung ausgeben, daß die Datei nicht gefunden wurde.
So sieht das ganze dann aus:
Aber, wie gesagt, das kann's ja eigentlich nicht sein, daß man die MFC derartig austricksen muß, um kein Speicherleck zu bekommen. Hab' ich da irgendwas falsch gemacht? Hat jemand hier ähnliche Erfahrungen gemacht?
Über Kommentare dazu würde ich mich sehr freuen.
Folgendes Problem:
Wenn ich meine MFC-Applikation starte und als Programmargument einen Dateinamen angebe, dann versucht das MFC-Framework die Datei in ProcessShellCommand zu öffnen. Wenn das allerdings fehlschlägt, z.B. weil es die angegebene Datei nicht gibt, dann beendet sich die Anwendung wieder kommentarlos und das mit IMPLEMENT_DYNCREATE erzeugte CDocument wird nicht wieder zerstört. Die Folge: ein Speicherleck!
Das kann ja eigentlich nicht sein, oder? Ich erzeuge das Dokument ja nicht selber, sondern es wird vom Framewürg erzeugt. Dann sollte das Framewürg es doch auch wieder zerstören, oder?

Ich habe mir jetzt erstmal so beholfen, daß ich sowohl das CDocument als auch den MainFrame vor dem Aufruf von ProcessShellCommand selber erzeuge. Dadurch habe ich einen Zeiger auf das Dokument, den ich deleten kann, wenn das ProcessShellCommand FALSE zurückliefert, bzw. setze ich dann den 'm_nShellCommand' Parameter von 'CCommandLineInfo' auf 'FileNew' und lasse ProcessShellCommand so nochmal laufen. Dadurch wird die Applikation eben nicht einfach kommentarlos geschlossen sondern sie wird mit einem leeren Dokument geöffnet. So kann ich auch noch eine Meldung ausgeben, daß die Datei nicht gefunden wurde.
So sieht das ganze dann aus:
Code:
// Dokument und MainWnd erzeugen, um eventuelles Speicherleck zu vermeiden,
// falls die Datei im Aufrufparameter nicht existiert
CVDMIDEDoc * pDoc = (CVDMIDEDoc *)pDocTemplate->CreateNewDocument();
m_pMainWnd = pDocTemplate->CreateNewFrame(pDoc, NULL);
// Verteilung der in der Befehlszeile angegebenen Befehle
if (!ProcessShellCommand(cmdInfo))
{
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNew;
cmdInfo.m_strFileName.Empty();
if (!ProcessShellCommand(cmdInfo))
{
delete pDoc;
return FALSE;
}
}
Über Kommentare dazu würde ich mich sehr freuen.