<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[MDI&#x2F;SDI vs. Dialog]]></title><description><![CDATA[<p>Hallo!</p>
<p>Es geht um MFC Applikationen, die vom Visual Studio Assistenten erstellt wurden.<br />
Bei dialogbasierte Anwendungen wird in der InitInstance der App-Klasse immer eine eine Instanz des Hauptdialoges auf dem Stack(?) erstellt.</p>
<pre><code class="language-cpp">// Kurzer Code dazu
CApp::InitInstance()
{
   // Code vom Assistenten ...
   CMainDlg Dlg;

   m_pMainWnd = &amp;Dlg;

   // usw.
}
</code></pre>
<p>Bei MDI oder auch SDI Anwendungen wird die MainFrame Klasse hingegen auf dem Heap(?) erzeugt und auch die Dokument-Templates werden so erzeugt.</p>
<pre><code class="language-cpp">// Hier MDI Beispiel, SDI eigentlich analog
CApp::InitInstance()
{
   // Code vom Assistenten ...
CMultiDocTemplate* pDocTemplate;
	pDocTemplate = new CMultiDocTemplate(IDR_MDIAppTYPE,
		RUNTIME_CLASS(CMDIAppDoc),
		RUNTIME_CLASS(CChildFrame), // Benutzerspezifischer MDI-Child-Rahmen
		RUNTIME_CLASS(CMDIAppView));
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);

	// Haupt-MDI-Rahmenfenster erstellen
	CMainFrame* pMainFrame = new CMainFrame;
	if (!pMainFrame || !pMainFrame-&gt;LoadFrame(IDR_MAINFRAME))
	{
		delete pMainFrame;
		return FALSE;
	}
	m_pMainWnd = pMainFrame;
}
</code></pre>
<p>Später werden die Zeiger nicht gelöscht. Das scheint intern zu geschehen. Wo denn und warum ist das so? Kann man auch hier die Klassen auf dem Stack erstellen wie beim Dialogbeispiel oder warum ist das hier so gelöst?</p>
<p>Ich habe z.B. eine SDI App, die den MainFrame per new erzeugt aber ein Stack-Instanz von CCreateContext. Also ähnlich wie in diesem <a href="http://simplesamples.info/MFC/WithoutTemplates.php" rel="nofollow">Beispiel</a>. Ist das korrekt so?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/204284/mdi-sdi-vs-dialog</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 12:28:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204284.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Feb 2008 08:56:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to MDI&#x2F;SDI vs. Dialog on Fri, 01 Feb 2008 08:56:47 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Es geht um MFC Applikationen, die vom Visual Studio Assistenten erstellt wurden.<br />
Bei dialogbasierte Anwendungen wird in der InitInstance der App-Klasse immer eine eine Instanz des Hauptdialoges auf dem Stack(?) erstellt.</p>
<pre><code class="language-cpp">// Kurzer Code dazu
CApp::InitInstance()
{
   // Code vom Assistenten ...
   CMainDlg Dlg;

   m_pMainWnd = &amp;Dlg;

   // usw.
}
</code></pre>
<p>Bei MDI oder auch SDI Anwendungen wird die MainFrame Klasse hingegen auf dem Heap(?) erzeugt und auch die Dokument-Templates werden so erzeugt.</p>
<pre><code class="language-cpp">// Hier MDI Beispiel, SDI eigentlich analog
CApp::InitInstance()
{
   // Code vom Assistenten ...
CMultiDocTemplate* pDocTemplate;
	pDocTemplate = new CMultiDocTemplate(IDR_MDIAppTYPE,
		RUNTIME_CLASS(CMDIAppDoc),
		RUNTIME_CLASS(CChildFrame), // Benutzerspezifischer MDI-Child-Rahmen
		RUNTIME_CLASS(CMDIAppView));
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);

	// Haupt-MDI-Rahmenfenster erstellen
	CMainFrame* pMainFrame = new CMainFrame;
	if (!pMainFrame || !pMainFrame-&gt;LoadFrame(IDR_MAINFRAME))
	{
		delete pMainFrame;
		return FALSE;
	}
	m_pMainWnd = pMainFrame;
}
</code></pre>
<p>Später werden die Zeiger nicht gelöscht. Das scheint intern zu geschehen. Wo denn und warum ist das so? Kann man auch hier die Klassen auf dem Stack erstellen wie beim Dialogbeispiel oder warum ist das hier so gelöst?</p>
<p>Ich habe z.B. eine SDI App, die den MainFrame per new erzeugt aber ein Stack-Instanz von CCreateContext. Also ähnlich wie in diesem <a href="http://simplesamples.info/MFC/WithoutTemplates.php" rel="nofollow">Beispiel</a>. Ist das korrekt so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447417</guid><dc:creator><![CDATA[HaJo.]]></dc:creator><pubDate>Fri, 01 Feb 2008 08:56:47 GMT</pubDate></item><item><title><![CDATA[Reply to MDI&#x2F;SDI vs. Dialog on Mon, 04 Feb 2008 17:23:28 GMT]]></title><description><![CDATA[<p>Ist die Frage so merkwürdig oder weiß das etwa niemand?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449228</guid><dc:creator><![CDATA[HaJo.]]></dc:creator><pubDate>Mon, 04 Feb 2008 17:23:28 GMT</pubDate></item><item><title><![CDATA[Reply to MDI&#x2F;SDI vs. Dialog on Tue, 05 Feb 2008 08:03:11 GMT]]></title><description><![CDATA[<p>Klassen, die von CFrameWnd abgeleitet werden zerstören sich mit <strong>delete this</strong> in OnNcDestroy/PostNcDestroy.<br />
CDialog Klassen sind dafür angelegt auf dem Stack zu existieren und haben keinen delete this.</p>
<p>Da aber in InitInstance bei einer Dialog Anwendung DoModal aufgerufen wird, hat dieses Objekt keine Lebensdauer über InitInstance hinaus.<br />
Zudem wird der m_pMainWnd Zeiger automatisch auf NULL zurück gesetzt, wenn der Dialog endet.<br />
m_pMainWnd wird nur als Zeiger in vielen internen MFC Routinen benötigt um eben das Hauptapplikationsfenster zu bestimmen.</p>
<p>Gleiches gilt für die Document Templates. Diese sind Bestandteil des DocumentManagers der Applikation, der automatisch abgeräumt wird, wenn die Applikation terminiert.</p>
<p>HTH</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449479</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 05 Feb 2008 08:03:11 GMT</pubDate></item><item><title><![CDATA[Reply to MDI&#x2F;SDI vs. Dialog on Thu, 07 Feb 2008 15:59:07 GMT]]></title><description><![CDATA[<p>Danke für die Information.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451338</guid><dc:creator><![CDATA[HaJo.]]></dc:creator><pubDate>Thu, 07 Feb 2008 15:59:07 GMT</pubDate></item></channel></rss>