<?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[Finally in ATL?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich komme von C# und entwickle gerade meinen ersten ComServer mit C++ (ATL).<br />
Ich wollte einen try{}catch{..} Block mit finally{} abschließen, was in C# gang und gebe ist.<br />
Ich bekomme immer nur die Meldung:<br />
&quot;Fehler 1 error C2065: 'finally': nichtdeklarierter Bezeichner&quot;</p>
<p>Wenn ich das finally Schlüsselwort eingebe, wird es vom VS Studio (bei mir) blau dargestellt. Gibt es finally gar nicht in C++? In der MSDN kann ich nichts brauchbares finden.</p>
<p>Gruß<br />
camelord</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/257067/finally-in-atl</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 15:14:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257067.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Dec 2009 10:40:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 10:40:55 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich komme von C# und entwickle gerade meinen ersten ComServer mit C++ (ATL).<br />
Ich wollte einen try{}catch{..} Block mit finally{} abschließen, was in C# gang und gebe ist.<br />
Ich bekomme immer nur die Meldung:<br />
&quot;Fehler 1 error C2065: 'finally': nichtdeklarierter Bezeichner&quot;</p>
<p>Wenn ich das finally Schlüsselwort eingebe, wird es vom VS Studio (bei mir) blau dargestellt. Gibt es finally gar nicht in C++? In der MSDN kann ich nichts brauchbares finden.</p>
<p>Gruß<br />
camelord</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826283</guid><dc:creator><![CDATA[camelord@gmx.de]]></dc:creator><pubDate>Tue, 22 Dec 2009 10:40:55 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 11:03:43 GMT]]></title><description><![CDATA[<p>Nein. Das Schlüsselwort gibt es in C++ nicht.</p>
<p>So, wie ich das sehe, kannst du hier eigentlich einen Destruktor benutzen, da dieser auch im Falle einer Exception aufgrund des Rollback aufgerufen wird.</p>
<p>(Bin jetzt nicht 100% sicher, ob das äquivalent zu finally angesehen kann, aber auf den ersten Blick scheint es mir so..)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826293</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 22 Dec 2009 11:03:43 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 11:08:00 GMT]]></title><description><![CDATA[<p>Sowas gibt es in ISO-C++ nicht. Eigentlich ist es auch nicht notwendig und wichtig. Platziere den Code hinter den catch-Block, dann wird es auch immer ausgeführt oder, wie oben gesagt, pack den Code in einen Destruktor, der dank Stack-Unwinding aufgerufen wird. Wenn du nur für Windows programmierst, ist der VS-spezifische __try/__finally-Block für dich evtl. interessant.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/yb3kz605%28VS.80%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/yb3kz605(VS.80).aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826295</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Tue, 22 Dec 2009 11:08:00 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 11:07:32 GMT]]></title><description><![CDATA[<p>Du könntest Microsofts C/C++-Extensions __try, __except und __finally nutzen, aber diese Fehlerbehandlung kannst du nicht mit try/catch mischen (zumindest nicht innerhalb einer Funktion). Außerdem kriege ich nur wieder einen auf den Deckel, wenn ich hier mit Sachen komme, die nicht hundertprozentig C++ sind... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826296</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Tue, 22 Dec 2009 11:07:32 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 11:50:24 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Eigentlich ist es auch nicht notwendig und wichtig. Platziere den Code hinter den catch-Block, dann wird es auch immer ausgeführt</p>
</blockquote>
<p>Das sehe ich nicht so. Natürlich geht es auch irgendwie anders, aber Exceptions sind ja gerade dazu da, daß man den Code zur Fehlerbehandlung klar strukturiert und übersichtlich schreiben kann.<br />
Dein Vorschlag mit &quot;hinter den catch-Block&quot; macht nicht wirklich das selbe, z.B. wenn der catch-Block returned oder selbst wieder eine Exception wirft. Und genau um solche Fälle geht es ja bei finally.</p>
<p>Statements zum Umgang mit Exceptions kann man gar nicht genug haben, ich persönlich bin ja ein großer Fan von Python's try/except/else/finally <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826309</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Tue, 22 Dec 2009 11:50:24 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 12:02:42 GMT]]></title><description><![CDATA[<p>wie drakon bereits gesagt hat, kann man Destruktoren benutzen, um so etwas wie finally hinzubekommen. Im Grunde ist finally eh nur ein Workaround für fehlendes RAII, oder andersrum gesagt: wo du andernorts finally benutzen musst, kannst/solltest du in C++ RAII nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826317</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 Dec 2009 12:02:42 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 12:12:48 GMT]]></title><description><![CDATA[<p>ok dann mal konkreter:</p>
<p>So mach ich es bisher:</p>
<p>try<br />
{<br />
::EnterCriticalSection(&amp;m_csControllerMessgage);<br />
//Codeblock<br />
}<br />
catch(...)<br />
{<br />
//bla bla<br />
}<br />
::LeaveCriticalSection(&amp;m_csControllerMessgage);</p>
<p>In C# bin ich es eben gewohnt, solch ein Konstrukt mit finally abzuschließen.<br />
Das obige Beispiel sieht irgendwie unschön aus.</p>
<p>Wie macht man sowas dann in C++?<br />
Gruß<br />
camelord</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826324</guid><dc:creator><![CDATA[camelord@gmx.de]]></dc:creator><pubDate>Tue, 22 Dec 2009 12:12:48 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 12:18:21 GMT]]></title><description><![CDATA[<p>wie würdest du das denn mit finally machen, bzw. welchen Teil würdest du in den finally-Block verschieben? UND: welcher Teil kann eine Exception werfen, der Codeblock oder ::EnterCriticalSection()?<br />
Dein Konstrukt sieht nicht wegen dem fehlenden finally unschön aus, sondern wegen dem vorhandenen try/catch, das offenbar nicht auf den kleinstmöglichen Bereich reduziert wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826327</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 Dec 2009 12:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 12:21:47 GMT]]></title><description><![CDATA[<p>Mal am Beispiel von MFC-Klassen beschrieben (ich benutze die hauptsächlich):<br />
In diesem Falle kann man z.B. CSingleLock benutzen, dem Ctor das Sync-Object (m_csControllerMessage) übergeben und InitalLock auf TRUE setzen.</p>
<pre><code class="language-cpp">CCriticalSection m_csControllerMessage;
...
void CClass::MyFunc()
{
    CSingleLock lock(&amp;m_csControllerMessage, TRUE);
    // tu was...
}// hier &quot;automatisch&quot; unlock
</code></pre>
<p>Das ware ein Beispiel für RAII.</p>
<p>EDIT: Da war jemand schneller... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826329</guid><dc:creator><![CDATA[R3dNeXX]]></dc:creator><pubDate>Tue, 22 Dec 2009 12:21:47 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 12:34:45 GMT]]></title><description><![CDATA[<p>So fänd ichs prima:</p>
<p>try {<br />
::EnterCriticalSection(&amp;m_csResultStateMessgage);<br />
try {<br />
//Code<br />
}<br />
finally {<br />
::LeaveCriticalSection(&amp;m_csResultStateMessgage);<br />
}<br />
}<br />
catch(...){<br />
//bla blubb<br />
}</p>
<p>get aber net..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826335</guid><dc:creator><![CDATA[camelord@gmx.de]]></dc:creator><pubDate>Tue, 22 Dec 2009 12:34:45 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 12:51:37 GMT]]></title><description><![CDATA[<p><a href="mailto:camelord@gmx.de" rel="nofollow">camelord@gmx.de</a> schrieb:</p>
<blockquote>
<p>So fänd ichs prima:</p>
<pre><code class="language-cpp">try {		
     ::EnterCriticalSection(&amp;m_csResultStateMessgage);
     try {
           //Code
	 }
     finally {
	        ::LeaveCriticalSection(&amp;m_csResultStateMessgage);
	     }
    }
catch(...){
            //bla blubb
          }
</code></pre>
<p>get aber net..</p>
</blockquote>
<p>Mal abgesehn von der grausamen Klammersetzung die du durch die fehlenden cpp-Tags versteckt hast:</p>
<pre><code class="language-cpp">class CriticalSectionWrapper
{
  CCriticalSection&amp; cs; //evtl. const, wenn möglich, Typ auch entsprechend Anpassen
public:
  CriticalSectionWrapper(CCriticalSection&amp; cs_) //hier auch  
  : cs(cs_)
  {
    ::EnterCriticalSection(&amp;cs);
  }
  ~CriticalSectionWrapper()
  {
    ::LeaveCriticalSection(&amp;cs);
  } 
};

//.....

try 
{		
  CriticalSectionWrapper(m_csResultStateMessgage);
  //Code
}
catch(...)
{
  //bla blubb
}
</code></pre>
<p>Wenn //Code eine exception wirft wird der CriticalSectionWrapper beim Verlassendes try-Blocks zerstört und damit per DTor die Critical section wieder verlassen. Ganz klassischer Fall von RAII. Wenn du wie von R3dNeXX vorausgesetzt tatsächlich die MFC verwendest schau dir mal das von ihm genannte CSingleLock an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826345</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 Dec 2009 12:51:37 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 13:15:36 GMT]]></title><description><![CDATA[<p>Vielen dank..<br />
Ich habe nach dem Hinweis von R3dNeXX sowas für ATL gefunden.<br />
Kann ich das auch so schreiben:</p>
<pre><code class="language-cpp">CComAutoCriticalSection m_csResultStateMessage;
...
void CClass::MyFunc()
{
     try
     {       
          CComCritSecLock&lt;CComAutoCriticalSection&gt; lock(myCriticalSectionObject, true);
          //Code
     }
     catch(...)
     {
          //bla blubb
     }        
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1826362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826362</guid><dc:creator><![CDATA[camelord@gmx.de]]></dc:creator><pubDate>Tue, 22 Dec 2009 13:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 13:22:29 GMT]]></title><description><![CDATA[<p><a href="mailto:camelord@gmx.de" rel="nofollow">camelord@gmx.de</a> schrieb:</p>
<blockquote>
<p>Kann ich das auch so schreiben:</p>
</blockquote>
<p>Klar, zumindest wenn die Lock-Klasse nicht irgendeinen unerwarteten Nebeneffekt hat. Ansonsten ist das doch das Selbe wie in meinem Beispiel (mal abgesehn dass die Lock-Klasse ne andere ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826369</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 Dec 2009 13:22:29 GMT</pubDate></item><item><title><![CDATA[Reply to Finally in ATL? on Tue, 22 Dec 2009 13:25:00 GMT]]></title><description><![CDATA[<p>Na dann nimm ich lieber dein Beispiel. C++ trau ich noch nicht so ganz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Vielen dank für die flotte Hilfe!</p>
<p>Schönen Tag noch..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826372</guid><dc:creator><![CDATA[camelord@gmx.de]]></dc:creator><pubDate>Tue, 22 Dec 2009 13:25:00 GMT</pubDate></item></channel></rss>