<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Martin&#039;s Blog &#187; MFC</title>
	<atom:link href="http://blog.m-ri.de/index.php/category/programmieren/mfc/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.m-ri.de</link>
	<description>Gesammeltes aus dem Leben eines &#34;normalen&#34; Programmierers... :-)</description>
	<lastBuildDate>Thu, 29 Jul 2010 19:26:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MFC-Next 9.0 &gt; MFC 10.0 denn CMFCRibbonPanel::EnableLaunchButton gibt es nicht mehr</title>
		<link>http://blog.m-ri.de/index.php/2010/07/25/mfc-next-9-0-mfc-10-0-denn-cmfcribbonpanelenablelaunchbutton-gibt-es-nicht-mehr/</link>
		<comments>http://blog.m-ri.de/index.php/2010/07/25/mfc-next-9-0-mfc-10-0-denn-cmfcribbonpanelenablelaunchbutton-gibt-es-nicht-mehr/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 15:19:40 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[MFC-Next]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=645</guid>
		<description><![CDATA[<p>Sehr erfreut waren viele C++ Entwickler darüber das es mit der <em>MFC</em> in <em>VC-2008</em> weiter ging und <em>MFC-Next </em>veröffentlicht wurde. Das ganze wurde dann fest in <em>VS-2008 SP1</em> integriert. Normalerweise sind wir es gewohnt, dass zur <em>MFC </em>nur Dinge hinzukommen und nichts wegfällt.</p>
<p>Für die <em>MFC 10.0</em> aus <em>VS-2010</em> gilt das diesmal nicht: <strong><em>MFC 10.0 &lt; MFC-Next 9.0</em></strong>!</p>
<p>Irgendwie hat es <a href="http://msdn.microsoft.com/en-us/library/bb983968(VS.100).aspx">CMFCRibbonPanel::EnableLaunchButton</a> nicht in die <em>MFC 10.0 </em>geschafft, obwohl die Funktion vollständig in der <em>MFC-Next 9.0 </em>implementiert war. Das soll mal einer verstehen <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_confused.gif' alt=':?' class='wp-smiley' />  ich jedenfalls nicht!</p>
<p>Diese Funktion sorgt für den kleinen netten Schalter in einem Panel:<br />
<a href="http://blog.m-ri.de/wp-content/uploads/2010/07/LaunchButton.jpg"><img class="alignnone size-full wp-image-646" title="LaunchButton" src="http://blog.m-ri.de/wp-content/uploads/2010/07/LaunchButton.jpg" alt="" width="173" height="102" /></a></p>
<p>Erstaunlicherweise gibt es diese Funktion nun nicht mehr! Wer also 100% Office-kompatible Anwendungen schreiben will ist hier schon mal aufgeschmissen, wenn er das mit MFC 10.0 machen will.<br />
Im Header finden wir diese Funktion noch mit einem <em>#ifdef </em>auskommentiert. Allerdings nützt es nichts diesen <em>#define </em>zu setzen, denn es gibt keine Implementierung und entsprechend keinen Code in der DLL/Library. Ja und in der <a href="http://msdn.microsoft.com/en-us/library/bb983968(VS.100).aspx">MFC Doku </a>finden wir die Funktion auch noch.</p>
<p>Und auch dieses Problem war noch in der Beta-Phase bekannt und wurde abgebügelt, wie man in den nachfolgenden Links lesen kann.<br />
<a href="http://social.msdn.microsoft.com/Forums/en/vcmfcatl/thread/29ad2859-6341-4ffb-85c2-f5f056a6ca48">http://social.msdn.microsoft.com/Forums/en/vcmfcatl/thread/29ad2859-6341-4ffb-85c2-f5f056a6ca48</a><br />
<a href="https://connect.microsoft.com/VisualStudioJapan/feedback/details/533876/cmfcribbonpanel-enablelaunchbutton?wa=wsignin1.0">https://connect.microsoft.com/VisualStudioJapan/feedback/details/533876/cmfcribbonpanel-enablelaunchbutton?wa=wsignin1.0</a><br />
<strong>Wem es möglich ist, sollte hier bitte Abstimmen und diesen Bug als wichtig kennzeichnen!</strong></p>
<p>Langsam frage ich mich ob es nicht gescheiter gewesen wäre bei MFC-Next 9.0 zu bleiben und mit VS-2008 weiter zu arbeiten.<br />
Tja und so hat die <a href="http://www.bcgsoft.com">BCG-Library</a> in Verbindung mit VS-2010 auch eine Daseinsberechtigung. Die kann diesen LaunchButton natürlich darstellen.</p>
<p>PS: Auf Nachfrage bei Microsoft bekam ich eine Antwort aber keinerlei Begründung. Jetzt habe ich eine Support-Anfrage dies bzgl. laufen, allerdings mit wenig Hoffnung. <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<hr /><small>Copyright &copy; 2008 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>
<div class="sociable">

<ul>
	<li class="sociablefirst"><a rel="nofollow"  href="javascript:AddToFavorites();" title="Add to favorites"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/addtofavorites.png" title="Add to favorites" alt="Add to favorites" /></a></li>
	<li><a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F25%2Fmfc-next-9-0-mfc-10-0-denn-cmfcribbonpanelenablelaunchbutton-gibt-es-nicht-mehr%2F&amp;title=MFC-Next%209.0%20%3E%20MFC%2010.0%20denn%20CMFCRibbonPanel%3A%3AEnableLaunchButton%20gibt%20es%20nicht%20mehr&amp;annotation=Sehr%20erfreut%20waren%20viele%20C%2B%2B%20Entwickler%20dar%C3%BCber%20das%20es%20mit%20der%20MFC%20in%20VC-2008%20weiter%20ging%20und%20MFC-Next%20ver%C3%B6ffentlicht%20wurde.%20Das%20ganze%20wurde%20dann%20fest%20in%20VS-2008%20SP1%20integriert.%20Normalerweise%20sind%20wir%20es%20gewohnt%2C%20dass%20zur%20MFC%20nur%20Dinge%20hinzukommen%20" title="Google Bookmarks"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" /></a></li>
	<li><a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F25%2Fmfc-next-9-0-mfc-10-0-denn-cmfcribbonpanelenablelaunchbutton-gibt-es-nicht-mehr%2F&amp;title=MFC-Next%209.0%20%3E%20MFC%2010.0%20denn%20CMFCRibbonPanel%3A%3AEnableLaunchButton%20gibt%20es%20nicht%20mehr&amp;notes=Sehr%20erfreut%20waren%20viele%20C%2B%2B%20Entwickler%20dar%C3%BCber%20das%20es%20mit%20der%20MFC%20in%20VC-2008%20weiter%20ging%20und%20MFC-Next%20ver%C3%B6ffentlicht%20wurde.%20Das%20ganze%20wurde%20dann%20fest%20in%20VS-2008%20SP1%20integriert.%20Normalerweise%20sind%20wir%20es%20gewohnt%2C%20dass%20zur%20MFC%20nur%20Dinge%20hinzukommen%20" title="del.icio.us"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" /></a></li>
	<li><a rel="nofollow"  href="http://www.mister-wong.de/addurl/?bm_url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F25%2Fmfc-next-9-0-mfc-10-0-denn-cmfcribbonpanelenablelaunchbutton-gibt-es-nicht-mehr%2F&amp;bm_description=MFC-Next%209.0%20%3E%20MFC%2010.0%20denn%20CMFCRibbonPanel%3A%3AEnableLaunchButton%20gibt%20es%20nicht%20mehr&amp;plugin=soc" title="MisterWong.DE"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/misterwong.png" title="MisterWong.DE" alt="MisterWong.DE" /></a></li>
	<li><a rel="nofollow"  href="http://technorati.com/faves?add=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F25%2Fmfc-next-9-0-mfc-10-0-denn-cmfcribbonpanelenablelaunchbutton-gibt-es-nicht-mehr%2F" title="Technorati"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" /></a></li>
	<li><a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F25%2Fmfc-next-9-0-mfc-10-0-denn-cmfcribbonpanelenablelaunchbutton-gibt-es-nicht-mehr%2F&amp;t=MFC-Next%209.0%20%3E%20MFC%2010.0%20denn%20CMFCRibbonPanel%3A%3AEnableLaunchButton%20gibt%20es%20nicht%20mehr" title="Facebook"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" /></a></li>
	<li><a rel="nofollow"  href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F25%2Fmfc-next-9-0-mfc-10-0-denn-cmfcribbonpanelenablelaunchbutton-gibt-es-nicht-mehr%2F&amp;title=MFC-Next%209.0%20%3E%20MFC%2010.0%20denn%20CMFCRibbonPanel%3A%3AEnableLaunchButton%20gibt%20es%20nicht%20mehr" title="Live"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" /></a></li>
	<li class="sociablelast"><a rel="nofollow"  href="http://twitter.com/home?status=MFC-Next%209.0%20%3E%20MFC%2010.0%20denn%20CMFCRibbonPanel%3A%3AEnableLaunchButton%20gibt%20es%20nicht%20mehr%20-%20http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F25%2Fmfc-next-9-0-mfc-10-0-denn-cmfcribbonpanelenablelaunchbutton-gibt-es-nicht-mehr%2F" title="Twitter"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" /></a></li>
</ul>
</div>

	<h4>Themenverwandte Beiträge:</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.m-ri.de/index.php/2009/12/03/afxmessagebox-versus-cwndmessagebox/" title="AfxMessageBox versus CWnd::MessageBox (Do 03. Dez 2009)">AfxMessageBox versus CWnd::MessageBox</a> (4)</li>
	<li><a href="http://blog.m-ri.de/index.php/2007/06/02/wie-findet-die-mfc-80-eigentlich-die-mfc80llldll-dateien/" title="Wie findet die MFC 8.0 eigentlich die MFC80lll.DLL Dateien? (Sa 02. Jun 2007)">Wie findet die MFC 8.0 eigentlich die MFC80lll.DLL Dateien?</a> (0)</li>
	<li><a href="http://blog.m-ri.de/index.php/2009/12/21/vs-tipps-tricks-springe-zur-naechsten-klammer-funktioniert-auch-fuer-if-elif-else-und-endif/" title="VS-Tipps &#038; Tricks: Springe zur nächsten Klammer funktioniert auch für #if, #elif, #else und #endif (Mo 21. Dez 2009)">VS-Tipps &#038; Tricks: Springe zur nächsten Klammer funktioniert auch für #if, #elif, #else und #endif</a> (1)</li>
</ul>

]]></description>
		<wfw:commentRss>http://blog.m-ri.de/index.php/2010/07/25/mfc-next-9-0-mfc-10-0-denn-cmfcribbonpanelenablelaunchbutton-gibt-es-nicht-mehr/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bug in der MFC von VC-2010 in CImageList::DrawIndirect</title>
		<link>http://blog.m-ri.de/index.php/2010/07/21/bug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect/</link>
		<comments>http://blog.m-ri.de/index.php/2010/07/21/bug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 18:35:35 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[VC-Express]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=643</guid>
		<description><![CDATA[<p>Die Funktion <em>CImageList::DrawIndirect </em>der <em>MFC-10 </em></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL CImageList<span style="color: #008080;">::</span><span style="color: #007788;">DrawIndirect</span><span style="color: #008000;">&#40;</span>CDC<span style="color: #000040;">*</span> pDC, <span style="color: #0000ff;">int</span> nImage, POINT pt, SIZE sz,
    POINT ptOrigin, UINT fStyle <span style="color: #000080;">=</span> ILD_NORMAL, DWORD dwRop <span style="color: #000080;">=</span> SRCCOPY,
    COLORREF rgbBack <span style="color: #000080;">=</span> CLR_DEFAULT, COLORREF rgbFore <span style="color: #000080;">=</span> CLR_DEFAULT,
    DWORD fState <span style="color: #000080;">=</span> ILS_NORMAL, DWORD Frame <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>,
    COLORREF crEffect <span style="color: #000080;">=</span> CLR_DEFAULT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>hat einen massiven Bug: Sie funktioniert einfach nicht.</p>
<p>Der Unsinn, der sich eingeschlichen hat, liegt in der überschriebenen Funktion</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL CImageList<span style="color: #008080;">::</span><span style="color: #007788;">DrawIndirect</span><span style="color: #008000;">&#40;</span>IMAGELISTDRAWPARAMS<span style="color: #000040;">*</span> pimldp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>die durch die oben genannte Variante aufgerufen wird. Denn hier <em>cbSize </em>von <em>IMAGELISTDRAWPARAMS </em>nicht mehr in allen Fällen auf einen korrekten Wert gesetzt. Die Folge <em>cbSize </em>enthält Garbage und der Aufruf von ImageList_DrawIndirect geht in die Hose!<br />
Sowohl in <em>VC-2005</em> als auch <em>VC-2008</em> wurde in dieser Funktion explizit der cbSize Member überschrieben, je nach dem ob <em>ComCtl 6.0</em> oder höher von der Anwendung benutzt wird.</p>
<p>Auch das ist ein Bug, denn hierdurch wird evtl. ein korrekt gesetzter cbSize Wert mit <em>IMAGELISTDRAWPARAMS_V3_SIZE</em> (pre <em>IE 5.01</em> d.h. <em>_WIN32_IE &lt; 0&#215;0501</em>) überschrieben und damit vergrößert vergrößert. Dadurch kann es zu Zugriffsfehlern kommen oder zu unerwünschten Seiteneffekten.<br />
(siehe <a href="https://connect.microsoft.com/VisualStudio/feedback/details/322713/bug-in-cimagelist-drawindirect">https://connect.microsoft.com/VisualStudio/feedback/details/322713/bug-in-cimagelist-drawindirect</a>)</p>
<p>Also haben die Entwickler scheinbar die Zuweisung von <em>pimldp-&gt;cbSize = sizeof(IMAGELISTDRAWPARAMS)</em> entfernt! Allerdings haben Sie dabei vergessen in der anderen Funktion nun <em>cbSize </em>korrekt zu initialisieren!</p>
<p>Wir haben also wieder mal einen Fall von: <em>Let us fix one thing and break others&#8230;</em></p>
<p>Das Gemeine an der Sache ist, dass dieser Bug noch vor RTM bekannt war:<br />
<a href="https://connect.microsoft.com/VisualStudio/feedback/details/543108/bug-in-cimagelist-drawindirect">https://connect.microsoft.com/VisualStudio/feedback/details/543108/bug-in-cimagelist-drawindirect</a><br />
Nur ist er nicht mehr gefixed worden!</p>
<p>PS: Natürlich fährt die eigene Software mit der <em>MFC-10</em> auch gegen die Wand, wenn man die <em>CImageList::DrawIndirect(IMAGELISTDRAWPARAMS* pimldp)</em> Variante verwendet und selbst <em>cbSize </em>nicht initialisiert, was ein ordentlicher Entwickler aber sicherlich nicht vergisst! <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Wem es möglich ist, sollte bei den beiden Connect Einträgen Abstimmen und diesen Bug als wichtig kennzeichnen!</strong></p>
<hr /><small>Copyright &copy; 2008 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>
<div class="sociable">

<ul>
	<li class="sociablefirst"><a rel="nofollow"  href="javascript:AddToFavorites();" title="Add to favorites"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/addtofavorites.png" title="Add to favorites" alt="Add to favorites" /></a></li>
	<li><a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F21%2Fbug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect%2F&amp;title=Bug%20in%20der%20MFC%20von%20VC-2010%20in%20CImageList%3A%3ADrawIndirect&amp;annotation=Die%20Funktion%20CImageList%3A%3ADrawIndirect%20der%20MFC-10%20%0D%0ABOOL%20CImageList%3A%3ADrawIndirect%28CDC%2A%20pDC%2C%20int%20nImage%2C%20POINT%20pt%2C%20SIZE%20sz%2C%0D%0A%20%20%20%20POINT%20ptOrigin%2C%20UINT%20fStyle%20%3D%20ILD_NORMAL%2C%20DWORD%20dwRop%20%3D%20SRCCOPY%2C%0D%0A%20%20%20%20COLORREF%20rgbBack%20%3D%20CLR_DEFAULT%2C%20COLORREF%20rgbFore%20%3D%20CL" title="Google Bookmarks"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" /></a></li>
	<li><a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F21%2Fbug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect%2F&amp;title=Bug%20in%20der%20MFC%20von%20VC-2010%20in%20CImageList%3A%3ADrawIndirect&amp;notes=Die%20Funktion%20CImageList%3A%3ADrawIndirect%20der%20MFC-10%20%0D%0ABOOL%20CImageList%3A%3ADrawIndirect%28CDC%2A%20pDC%2C%20int%20nImage%2C%20POINT%20pt%2C%20SIZE%20sz%2C%0D%0A%20%20%20%20POINT%20ptOrigin%2C%20UINT%20fStyle%20%3D%20ILD_NORMAL%2C%20DWORD%20dwRop%20%3D%20SRCCOPY%2C%0D%0A%20%20%20%20COLORREF%20rgbBack%20%3D%20CLR_DEFAULT%2C%20COLORREF%20rgbFore%20%3D%20CL" title="del.icio.us"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" /></a></li>
	<li><a rel="nofollow"  href="http://www.mister-wong.de/addurl/?bm_url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F21%2Fbug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect%2F&amp;bm_description=Bug%20in%20der%20MFC%20von%20VC-2010%20in%20CImageList%3A%3ADrawIndirect&amp;plugin=soc" title="MisterWong.DE"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/misterwong.png" title="MisterWong.DE" alt="MisterWong.DE" /></a></li>
	<li><a rel="nofollow"  href="http://technorati.com/faves?add=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F21%2Fbug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect%2F" title="Technorati"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" /></a></li>
	<li><a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F21%2Fbug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect%2F&amp;t=Bug%20in%20der%20MFC%20von%20VC-2010%20in%20CImageList%3A%3ADrawIndirect" title="Facebook"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" /></a></li>
	<li><a rel="nofollow"  href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F21%2Fbug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect%2F&amp;title=Bug%20in%20der%20MFC%20von%20VC-2010%20in%20CImageList%3A%3ADrawIndirect" title="Live"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" /></a></li>
	<li class="sociablelast"><a rel="nofollow"  href="http://twitter.com/home?status=Bug%20in%20der%20MFC%20von%20VC-2010%20in%20CImageList%3A%3ADrawIndirect%20-%20http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F07%2F21%2Fbug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect%2F" title="Twitter"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" /></a></li>
</ul>
</div>

	<h4>Themenverwandte Beiträge:</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.m-ri.de/index.php/2008/11/16/cfiledialog-oeffnet-unter-umstaenden-nicht/" title="CFileDialog öffnet unter Umständen nicht (So 16. Nov 2008)">CFileDialog öffnet unter Umständen nicht</a> (2)</li>
	<li><a href="http://blog.m-ri.de/index.php/2009/01/29/wm_floatstatus-der-nette-helfer-fuer-eigene-popup-fenster/" title="WM_FLOATSTATUS der nette Helfer für eigene Popup Fenster (Do 29. Jan 2009)">WM_FLOATSTATUS der nette Helfer für eigene Popup Fenster</a> (0)</li>
	<li><a href="http://blog.m-ri.de/index.php/2007/06/02/wie-findet-die-mfc-80-eigentlich-die-mfc80llldll-dateien/" title="Wie findet die MFC 8.0 eigentlich die MFC80lll.DLL Dateien? (Sa 02. Jun 2007)">Wie findet die MFC 8.0 eigentlich die MFC80lll.DLL Dateien?</a> (0)</li>
</ul>

]]></description>
		<wfw:commentRss>http://blog.m-ri.de/index.php/2010/07/21/bug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ExitInstance gibt für dialogbasierende MFC Anwendungen Unfug zurück</title>
		<link>http://blog.m-ri.de/index.php/2010/06/18/exitinstance-gibt-fuer-dialogbasierende-mfc-anwendungen-unfug-zurueck/</link>
		<comments>http://blog.m-ri.de/index.php/2010/06/18/exitinstance-gibt-fuer-dialogbasierende-mfc-anwendungen-unfug-zurueck/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 18:58:56 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[4NT]]></category>
		<category><![CDATA[Batch]]></category>
		<category><![CDATA[CMD.EXE]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[Dialog]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=484</guid>
		<description><![CDATA[<p>Wer eine dialogbasierende Anwendung mal mit etwas mehr Aufmerksamkeit debuggt oder analysiert wird feststellen, dass der Returncode der Anwendung irgendwie ziemlich zufällig ist. Beobachtet man dies genauer dann stellt man folgendes fest:</p>
<ul>
<li>Beendet man die Anwendung mit der Maus (Klick auf X) oder OK/Cancel so ist der Returncode 0</li>
<li>Hält man die <em>Strg</em>-Taste beim Klick fest ist der Returncode 8</li>
<li>Beendet man die Anwendung mit <em>Alt+F4 </em>bekommen wir 2.</li>
<li>Und jedermann kann jetzt schon mal raten was passiert, wenn wir die Umschalttaste festhalten. Genau dann bekommen wir 4 als Returncode.</li>
</ul>
<p>Die Mystik hinter dem Ganzen ist die Behandlung von (<em>Afx)PostQuitMessage</em>. Eigentlich sollte mit dieser Nachricht auch der Exitcode gesetzt werden, der mit <em>WM_QUIT</em> versendet wird. Und wenn eben bei einer <em>MDI/SDI </em>Anwendung alles normal läuft, dann ist diese Nachricht die letzte, die aus der Messsagequeue gezogen wird. Und was passiert in <em>CWinApp::ExitInstance</em>? Genau&#8230; aus dem statischen Thread Puffer für die Windowsnachrichten wird mit  AfxGetCurrentMessage die letzte Windowsnachricht (normalerweise <em>WM_QUIT</em>) geholt und der <em>wParam</em> Wert bestimmt. Dieser wird dann zurückgegeben.</p>
<p>Leider ist aber <em>WM_QUIT </em>in manchen Fällen aber nicht die letzte Nachricht, die zum Beenden eines Programms führt. Ganz besonders eben nicht bei einer dialogbasierenden <em>MFC</em>-Anwendung. Da ist die letzte Nachricht ist dann eben ein <em>WM_COMMAND </em>oder ein <em>WM_LBUTTONUP </em>der das Schließen der Anwendung auslöst <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' />  Und der <em>wParam</em> Wert ist eben entsprechend dieser Nachricht belegt!</p>
<p>Gleiches passiert natürlich, wenn man nach dem Beenden der Messageloop noch andere interne Fenster zerstört. Auch in diesem Fall kann noch mal die interne <em>AfxWndProc</em> durchlaufen werden und dann wird der Returncode auch wieder verändert.</p>
<p>Wer also wirklich Wert auf den Returncode legt (im wahrsten Sinne des Wortes), der sollte sich nie auf den Wert verlassen, der durch <em>CWinApp::ExitInstance</em> zurückgegeben wird oder den Wert, den man selbst mit <em>AfxPostQuitMessage </em>evtl. versucht zu setzen. Eine Variable in <em>CWinApp </em>tut hier einen besseren Dienst. Ebenfalls sollte man ExitInstance überschreiben und immer 0 zurückgeben, wenn man sowieso keine Verwendung für den Returncode des Prozesses hat oder haben möchte.</p>
<p>BTW:<br />
Die Geschichte, wie ich darauf gekommen bin ist schon eigentümlich genug.<br />
Ich habe komplexere Batch-Dateien, die die gesamte Erstellung einer produktiv-Version regelt. Darin kommen im Problemfall auch ein paar Userinteraktionen vor. Diese werden durch Windows Anwendungen ausgelöst, die evtl. einen Dialog anzeigen. Jedem ist klar, dass ohne Dialog und ohne Fenster keine Nachricht abgearbeitet wird. Der Returncode ist also 0! Der Batch verwendet <a href="http://www.jpsoft.com/">4NT</a> Syntax und dort kann man <em>ON ERROR </em>definieren und somit sofort eine Fehlerbehandlung auslösen, wenn der Returncode eines Programms nicht 0 ist.<br />
Nun kann sich jeder schon denken was passiert ist. Die Userinteraktion wurde ausgelöst. Der Benutzer machte eine Angabe und&#8230; der Batch terminierte erstaunlicherweise mit einem Fehler&#8230; (s.o.)</p>
<hr /><small>Copyright &copy; 2008 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>
<div class="sociable">

<ul>
	<li class="sociablefirst"><a rel="nofollow"  href="javascript:AddToFavorites();" title="Add to favorites"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/addtofavorites.png" title="Add to favorites" alt="Add to favorites" /></a></li>
	<li><a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F06%2F18%2Fexitinstance-gibt-fuer-dialogbasierende-mfc-anwendungen-unfug-zurueck%2F&amp;title=ExitInstance%20gibt%20f%C3%BCr%20dialogbasierende%20MFC%20Anwendungen%20Unfug%20zur%C3%BCck&amp;annotation=Wer%20eine%20dialogbasierende%20Anwendung%20mal%20mit%20etwas%20mehr%20Aufmerksamkeit%20debuggt%20oder%20analysiert%20wird%20feststellen%2C%20dass%20der%20Returncode%20der%20Anwendung%20irgendwie%20ziemlich%20zuf%C3%A4llig%20ist.%20Beobachtet%20man%20dies%20genauer%20dann%20stellt%20man%20folgendes%20fest%3A%0D%0A%0D%0A%09Beende" title="Google Bookmarks"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" /></a></li>
	<li><a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F06%2F18%2Fexitinstance-gibt-fuer-dialogbasierende-mfc-anwendungen-unfug-zurueck%2F&amp;title=ExitInstance%20gibt%20f%C3%BCr%20dialogbasierende%20MFC%20Anwendungen%20Unfug%20zur%C3%BCck&amp;notes=Wer%20eine%20dialogbasierende%20Anwendung%20mal%20mit%20etwas%20mehr%20Aufmerksamkeit%20debuggt%20oder%20analysiert%20wird%20feststellen%2C%20dass%20der%20Returncode%20der%20Anwendung%20irgendwie%20ziemlich%20zuf%C3%A4llig%20ist.%20Beobachtet%20man%20dies%20genauer%20dann%20stellt%20man%20folgendes%20fest%3A%0D%0A%0D%0A%09Beende" title="del.icio.us"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" /></a></li>
	<li><a rel="nofollow"  href="http://www.mister-wong.de/addurl/?bm_url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F06%2F18%2Fexitinstance-gibt-fuer-dialogbasierende-mfc-anwendungen-unfug-zurueck%2F&amp;bm_description=ExitInstance%20gibt%20f%C3%BCr%20dialogbasierende%20MFC%20Anwendungen%20Unfug%20zur%C3%BCck&amp;plugin=soc" title="MisterWong.DE"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/misterwong.png" title="MisterWong.DE" alt="MisterWong.DE" /></a></li>
	<li><a rel="nofollow"  href="http://technorati.com/faves?add=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F06%2F18%2Fexitinstance-gibt-fuer-dialogbasierende-mfc-anwendungen-unfug-zurueck%2F" title="Technorati"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" /></a></li>
	<li><a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F06%2F18%2Fexitinstance-gibt-fuer-dialogbasierende-mfc-anwendungen-unfug-zurueck%2F&amp;t=ExitInstance%20gibt%20f%C3%BCr%20dialogbasierende%20MFC%20Anwendungen%20Unfug%20zur%C3%BCck" title="Facebook"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" /></a></li>
	<li><a rel="nofollow"  href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F06%2F18%2Fexitinstance-gibt-fuer-dialogbasierende-mfc-anwendungen-unfug-zurueck%2F&amp;title=ExitInstance%20gibt%20f%C3%BCr%20dialogbasierende%20MFC%20Anwendungen%20Unfug%20zur%C3%BCck" title="Live"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" /></a></li>
	<li class="sociablelast"><a rel="nofollow"  href="http://twitter.com/home?status=ExitInstance%20gibt%20f%C3%BCr%20dialogbasierende%20MFC%20Anwendungen%20Unfug%20zur%C3%BCck%20-%20http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F06%2F18%2Fexitinstance-gibt-fuer-dialogbasierende-mfc-anwendungen-unfug-zurueck%2F" title="Twitter"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" /></a></li>
</ul>
</div>

	<h4>Themenverwandte Beiträge:</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.m-ri.de/index.php/2009/08/09/vs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version/" title="VS-Tipps&#038;Tricks: Einfache Debug-Ausgabe mit TRACE auch in der Release Version (So 09. Aug 2009)">VS-Tipps&#038;Tricks: Einfache Debug-Ausgabe mit TRACE auch in der Release Version</a> (9)</li>
	<li><a href="http://blog.m-ri.de/index.php/2008/11/27/vs-tipps-tricks-heap-bugs-finden-teil-4/" title="VS Tipps &#038; Tricks: Heap Bugs finden (Teil 4) (Do 27. Nov 2008)">VS Tipps &#038; Tricks: Heap Bugs finden (Teil 4)</a> (0)</li>
	<li><a href="http://blog.m-ri.de/index.php/2008/11/04/vs-tipps-tricks-heap-bugs-finden-teil-3/" title="VS Tipps &#038; Tricks: Heap Bugs finden (Teil 3) (Di 04. Nov 2008)">VS Tipps &#038; Tricks: Heap Bugs finden (Teil 3)</a> (0)</li>
</ul>

]]></description>
		<wfw:commentRss>http://blog.m-ri.de/index.php/2010/06/18/exitinstance-gibt-fuer-dialogbasierende-mfc-anwendungen-unfug-zurueck/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bug in der Windows UI: SetRedraw verändert WS_VISIBLE Stil in einem RTF Control</title>
		<link>http://blog.m-ri.de/index.php/2010/01/14/bug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control/</link>
		<comments>http://blog.m-ri.de/index.php/2010/01/14/bug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 19:10:32 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Win32]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=528</guid>
		<description><![CDATA[<p>Ich habe eine relativ komplexe UI, die auch dynamisch Controls erzeugt. In diese Controls werden auch zum Teil Massen an Daten hineingeschoben. Damit alle Controls zeitgleich erst die Daten präsentieren verwende ich eine einfache Methode, die aus alten Windows Tagen stammt: <a href="http://msdn.microsoft.com/en-us/library/btaacw58(VS.80).aspx">CWnd::SetRedraw</a><em>/</em><a href="http://msdn.microsoft.com/en-us/library/ms912675.aspx">WM_SETREDRAW</a>. Man verwendet diese Nachricht zum Beispiel um das Flackern von Listboxen und Comboboxen zu verhindern, wenn man viele Daten einfügt.<br />
Diese Nachricht wird von allen Fenstern unterstützt oder sollte unterstützt werden <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Meine Software macht nun folgendes:</p>
<ul>
<li>Zuerst hat meine Ladeprozedur für die Daten, zuerst alle Controls erzeugt, oder überflüssige vernichtet und positioniert, oder evtl. nur ausgeblendet (<em>ShowWindow(SW_HIDE)</em>. D.h. nach dem ersten Laden der Daten ändert sich am Layout evtl. nichts mehr.</li>
<li>Anschließend wurde an alle Controls <em>CWnd::SetRedraw/WM_SETREDRAW</em> mit <em>FALSE </em>gesendet.</li>
<li>Dann die Daten geladen.</li>
<li>Nach dem Laden wird einfach wieder <em>CWnd::SetRedraw/WM_SETREDRAW </em>mit <em>TRUE</em> gesendet und ein Invalidate durchgeführt.</li>
</ul>
<p>Das funktioniert für alle Controls, mit einer Ausnahme: Das <em>RTF </em>Control. Wenn man <em>WM_SETREDRAW TRUE </em>an ein <em>RTF </em>Control sendet, das nicht sichtbar ist, dann wird dieses sichtbar. Der Stil <em>WS_VISIBLE </em>wird also verändert. <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_surprised.gif' alt=':eek:' class='wp-smiley' /> </p>
<p>Um das Problem zu isolieren habe ich <a href="http://blog.m-ri.de/wp-content/uploads/2009/12/TestRTFSetRedraw.zip">hier ein kleines Testprogramm</a> geschrieben. Der kritische Code sieht so aus. Das gesamte Projekt kann man hier auch herunterladen: Demoprojekt.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> CTestRTFSetRedrawDlg<span style="color: #008080;">::</span><span style="color: #007788;">OnBnClickedBtDoit</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
 <span style="color: #0000ff;">bool</span> bWasVisible <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>m_wndEdRTF.<span style="color: #007788;">GetStyle</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;</span> WS_VISIBLE<span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
 m_wndEdRTF.<span style="color: #007788;">SetRedraw</span><span style="color: #008000;">&#40;</span>FALSE<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
 m_wndEdRTF.<span style="color: #007788;">SetWindowText</span><span style="color: #008000;">&#40;</span>_T<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Line 1<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>Line 2<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>Line 3<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>Line 4&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
 m_wndEdRTF.<span style="color: #007788;">SetSel</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
 m_wndEdRTF.<span style="color: #007788;">SetRedraw</span><span style="color: #008000;">&#40;</span>TRUE<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
 m_wndEdRTF.<span style="color: #007788;">Invalidate</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
 <span style="color: #0000ff;">bool</span> bIsVisible <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>m_wndEdRTF.<span style="color: #007788;">GetStyle</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;</span> WS_VISIBLE<span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
 <span style="color: #666666;">// Check if the visible state changed</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>bIsVisible<span style="color: #000040;">!</span><span style="color: #000080;">=</span>bWasVisible<span style="color: #008000;">&#41;</span>
  AfxMessageBox<span style="color: #008000;">&#40;</span>_T<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;The visible state of the RTF control changed!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p lang="cpp"><strong>Nachtrag 16.01.2010 (Danke Sven für Deinen produktiven Kommentar):<br />
</strong>Auch andere Controls wie <em>Button</em>-, <em>Static</em>- und <em>Edit</em>-Controls verändern den Visible Status wenn <em>WM_SETREDRAW </em>angewendet wird. Einzig <em>Listbox</em>- und <em>Combobox</em>-Controls behalten den Visiblestatus korrekt bei <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </p>
<hr /><small>Copyright &copy; 2008 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>
<div class="sociable">

<ul>
	<li class="sociablefirst"><a rel="nofollow"  href="javascript:AddToFavorites();" title="Add to favorites"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/addtofavorites.png" title="Add to favorites" alt="Add to favorites" /></a></li>
	<li><a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F14%2Fbug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control%2F&amp;title=Bug%20in%20der%20Windows%20UI%3A%20SetRedraw%20ver%C3%A4ndert%20WS_VISIBLE%20Stil%20in%20einem%20RTF%20Control&amp;annotation=Ich%20habe%20eine%20relativ%20komplexe%20UI%2C%20die%20auch%20dynamisch%20Controls%20erzeugt.%20In%20diese%20Controls%20werden%20auch%20zum%20Teil%20Massen%20an%20Daten%20hineingeschoben.%20Damit%20alle%20Controls%20zeitgleich%20erst%20die%20Daten%20pr%C3%A4sentieren%20verwende%20ich%20eine%20einfache%20Methode%2C%20die%20aus%20al" title="Google Bookmarks"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" /></a></li>
	<li><a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F14%2Fbug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control%2F&amp;title=Bug%20in%20der%20Windows%20UI%3A%20SetRedraw%20ver%C3%A4ndert%20WS_VISIBLE%20Stil%20in%20einem%20RTF%20Control&amp;notes=Ich%20habe%20eine%20relativ%20komplexe%20UI%2C%20die%20auch%20dynamisch%20Controls%20erzeugt.%20In%20diese%20Controls%20werden%20auch%20zum%20Teil%20Massen%20an%20Daten%20hineingeschoben.%20Damit%20alle%20Controls%20zeitgleich%20erst%20die%20Daten%20pr%C3%A4sentieren%20verwende%20ich%20eine%20einfache%20Methode%2C%20die%20aus%20al" title="del.icio.us"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" /></a></li>
	<li><a rel="nofollow"  href="http://www.mister-wong.de/addurl/?bm_url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F14%2Fbug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control%2F&amp;bm_description=Bug%20in%20der%20Windows%20UI%3A%20SetRedraw%20ver%C3%A4ndert%20WS_VISIBLE%20Stil%20in%20einem%20RTF%20Control&amp;plugin=soc" title="MisterWong.DE"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/misterwong.png" title="MisterWong.DE" alt="MisterWong.DE" /></a></li>
	<li><a rel="nofollow"  href="http://technorati.com/faves?add=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F14%2Fbug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control%2F" title="Technorati"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" /></a></li>
	<li><a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F14%2Fbug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control%2F&amp;t=Bug%20in%20der%20Windows%20UI%3A%20SetRedraw%20ver%C3%A4ndert%20WS_VISIBLE%20Stil%20in%20einem%20RTF%20Control" title="Facebook"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" /></a></li>
	<li><a rel="nofollow"  href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F14%2Fbug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control%2F&amp;title=Bug%20in%20der%20Windows%20UI%3A%20SetRedraw%20ver%C3%A4ndert%20WS_VISIBLE%20Stil%20in%20einem%20RTF%20Control" title="Live"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" /></a></li>
	<li class="sociablelast"><a rel="nofollow"  href="http://twitter.com/home?status=Bug%20in%20der%20Windows%20UI%3A%20SetRedraw%20ver%C3%A4ndert%20WS_VISIBLE%20Stil%20in%20einem%20RTF%20Control%20-%20http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F14%2Fbug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control%2F" title="Twitter"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" /></a></li>
</ul>
</div>

	<h4>Themenverwandte Beiträge:</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.m-ri.de/index.php/2009/03/18/lvm_getsubitemrect-mit-lvir_icon-liefert-andere-ergebnisse-unter-vista-als-unter-xp/" title="LVM_GETSUBITEMRECT mit LVIR_ICON liefert andere Ergebnisse unter Vista als unter XP (Mi 18. Mrz 2009)">LVM_GETSUBITEMRECT mit LVIR_ICON liefert andere Ergebnisse unter Vista als unter XP</a> (5)</li>
	<li><a href="http://blog.m-ri.de/index.php/2008/12/07/aus-zwei-mach-eins-wie-man-zwei-cursor-kombinieren-kann/" title="Aus zwei mach eins: Wie man zwei Cursor kombinieren kann (So 07. Dez 2008)">Aus zwei mach eins: Wie man zwei Cursor kombinieren kann</a> (5)</li>
	<li><a href="http://blog.m-ri.de/index.php/2010/06/23/wie-man-den-namen-einer-registerwindowmessage-bekommt/" title="Wie man den Namen einer RegisterWindowMessage bekommt (Mi 23. Jun 2010)">Wie man den Namen einer RegisterWindowMessage bekommt</a> (0)</li>
</ul>

]]></description>
		<wfw:commentRss>http://blog.m-ri.de/index.php/2010/01/14/bug-in-windows-ui-setredraw-veraendert-ws_visible-stil-in-einem-rtf-control/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>CDialog::SetDefID und DM_SETDEFID, des Tastaturfreunds Liebling</title>
		<link>http://blog.m-ri.de/index.php/2010/01/04/cdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling/</link>
		<comments>http://blog.m-ri.de/index.php/2010/01/04/cdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 16:43:32 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Sonstiges]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[Dialoge]]></category>
		<category><![CDATA[Eingabetaste]]></category>
		<category><![CDATA[Tastatur]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=519</guid>
		<description><![CDATA[<p>Die Frage um die Eingabe-Taste in Dialogen und wie man diese &#8220;missbraucht&#8221; (sage ich mal provokant) ist eine regelmäßige Frage in allen Foren.</p>
<p>Die Intention ist oft klar. Man möchte mit der Eingabetaste eine bestimmte Aktion verbinden, die evtl. sehr oft ausgeführt werden soll und nicht den Dialog schließen.<br />
Die üblichen Wege sind schon mehrfach diskutiert worden und auch in meinem Blog finden sich dazu ein <a href="http://blog.m-ri.de/index.php/2008/09/21/die-return-taste-in-dialogen-eine-unendliche-geschichte/">Artikel</a> .</p>
<p>Zu kurz kommt bei dieser Diskussion die Funktion <em><a href="http://msdn.microsoft.com/en-us/library/7sd15kw3(VS.80).aspx">CDialog::SetDefID</a></em> bzw. <em><a href="http://msdn.microsoft.com/en-us/library/ms645413(VS.85).aspx">DM_SETDEFID</a> </em>Nachricht.<br />
Was macht diese Funktion/Nachricht?<br />
Sie definieren die Button-ID, die als Default-Aktion in einem Dialog ausgelöst werden soll und das ist nichts anderes als die Aktion die geschehen, soll wenn die Eingabe-Taste gedrückt wird.<br />
Viele Entwickler definieren einfach <em>OnOK</em> um. Aber das eigentlich tolle ist mit <em>SetDefID</em> den Button in Abhängigkeit der Daten umzusetzen und das hat auch einen visuellen Effekt für den Nutzer.</p>
<p>Mal ein Beispiel:<br />
Wir haben einen Dialog mit zwei List Views. Links Elemente die zur Auswahl stehen, rechts die Elemente in der Reihenfolge, die der Benutzer ausgewählt hat.<br />
Der Mausschubser wird einfach die Einträge auf der linken oder rechten Seite doppelklicken und damit auswählen oder entfernen. Entsprechende Buttons für Hinzufügen und Entfernen wird es auch geben. Man kann also auch links oder rechts markieren und dann den Hinzufügen oder Entfernen Schalter nutzen.</p>
<p>Dem Tastaturnutzer können wir helfen indem wir intelligent <em>CDialog::SetDefID / DM_SETDEFID</em> verwenden. Die Vorgehensweise ist einfach.</p>
<ul>
<li>Wir richten uns nur danach in welchem <em>List View </em>wir uns befinden, d.h. befinden wir uns im linken <em>List View </em>steuern wir den <em>Hinzufügen </em>Schalter, und im rechten <em>List View </em>steuern wir den <em>Entfernen </em>Schalter.</li>
<li>Wird also im linken List View ein Item ausgewählt, setzen wir mit <em>CDialog::SetDefID / DM_SETDEFID </em>die ID des <em>Hinzufügen </em>Schalters.</li>
<li>In dem Moment wird der <em>Hinzufügen </em>Schalter zum <em>Default</em>-Button. Der Nutzer kann nun die Eingabe-Taste drücken und die Items werden in die rechte Box verschoben.</li>
<li>Links liegt jetzt nun noch der Fokus, aber es sind keine Items mehr markiert. D.h. wir setzen nun den Default Button zurück auf <em>IDOK</em>.</li>
<li>Jetzt kann der Nutzer erneut ein Item markieren. Der <em>Default</em>-Button wird wieder der <em>Hinzufügen/Entfernen</em> Schalter und die Eingabetaste macht was der Nutzer gerne hätte.</li>
<li>Ist kein Item mehr markiert schließt die Eingabetaste wieder über <em>IDOK </em>den Dialog.</li>
</ul>
<p>Ohne Maus kann man also mit den Pfeiltasten, der Leertaste (evtl. <em>Strg</em>-Taste) und der Eingabetaste diesen Dialog bedienen. Und das sogar intuitiv, denn der entsprechende Default Button wird ja in der UI schön umrandet und hervorgehoben.<br />
Das freut jeden Tastaturfreund. Und man muss gar nichts groß machen mit der Behandlung Eingabetaste.</p>
<p>Damit das Ganze nicht so abstrakt ist, habe ich <a href="http://blog.m-ri.de/wp-content/uploads/2009/12/TestSetDefDlgID.zip">ein kleines Sample</a> gebaut, dass diese Anwendung zeigt. Es hat keine Implementierung für <em>Drag&amp;Drop </em>aber es macht deutlich, wie man dem Tastaturnutzer entgegen kommen kann indem man die Controls geschickt aktiviert.</p>
<hr /><small>Copyright &copy; 2008 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>
<div class="sociable">

<ul>
	<li class="sociablefirst"><a rel="nofollow"  href="javascript:AddToFavorites();" title="Add to favorites"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/addtofavorites.png" title="Add to favorites" alt="Add to favorites" /></a></li>
	<li><a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F04%2Fcdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling%2F&amp;title=CDialog%3A%3ASetDefID%20und%20DM_SETDEFID%2C%20des%20Tastaturfreunds%20Liebling&amp;annotation=Die%20Frage%20um%20die%20Eingabe-Taste%20in%20Dialogen%20und%20wie%20man%20diese%20%22missbraucht%22%20%28sage%20ich%20mal%20provokant%29%20ist%20eine%20regelm%C3%A4%C3%9Fige%20Frage%20in%20allen%20Foren.%0D%0A%0D%0ADie%20Intention%20ist%20oft%20klar.%20Man%20m%C3%B6chte%20mit%20der%20Eingabetaste%20eine%20bestimmte%20Aktion%20verbinden%2C%20die%20evtl" title="Google Bookmarks"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" /></a></li>
	<li><a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F04%2Fcdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling%2F&amp;title=CDialog%3A%3ASetDefID%20und%20DM_SETDEFID%2C%20des%20Tastaturfreunds%20Liebling&amp;notes=Die%20Frage%20um%20die%20Eingabe-Taste%20in%20Dialogen%20und%20wie%20man%20diese%20%22missbraucht%22%20%28sage%20ich%20mal%20provokant%29%20ist%20eine%20regelm%C3%A4%C3%9Fige%20Frage%20in%20allen%20Foren.%0D%0A%0D%0ADie%20Intention%20ist%20oft%20klar.%20Man%20m%C3%B6chte%20mit%20der%20Eingabetaste%20eine%20bestimmte%20Aktion%20verbinden%2C%20die%20evtl" title="del.icio.us"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" /></a></li>
	<li><a rel="nofollow"  href="http://www.mister-wong.de/addurl/?bm_url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F04%2Fcdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling%2F&amp;bm_description=CDialog%3A%3ASetDefID%20und%20DM_SETDEFID%2C%20des%20Tastaturfreunds%20Liebling&amp;plugin=soc" title="MisterWong.DE"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/misterwong.png" title="MisterWong.DE" alt="MisterWong.DE" /></a></li>
	<li><a rel="nofollow"  href="http://technorati.com/faves?add=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F04%2Fcdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling%2F" title="Technorati"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" /></a></li>
	<li><a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F04%2Fcdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling%2F&amp;t=CDialog%3A%3ASetDefID%20und%20DM_SETDEFID%2C%20des%20Tastaturfreunds%20Liebling" title="Facebook"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" /></a></li>
	<li><a rel="nofollow"  href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F04%2Fcdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling%2F&amp;title=CDialog%3A%3ASetDefID%20und%20DM_SETDEFID%2C%20des%20Tastaturfreunds%20Liebling" title="Live"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" /></a></li>
	<li class="sociablelast"><a rel="nofollow"  href="http://twitter.com/home?status=CDialog%3A%3ASetDefID%20und%20DM_SETDEFID%2C%20des%20Tastaturfreunds%20Liebling%20-%20http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2010%2F01%2F04%2Fcdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling%2F" title="Twitter"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" /></a></li>
</ul>
</div>

	<h4>Themenverwandte Beiträge:</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.m-ri.de/index.php/2008/12/07/aus-zwei-mach-eins-wie-man-zwei-cursor-kombinieren-kann/" title="Aus zwei mach eins: Wie man zwei Cursor kombinieren kann (So 07. Dez 2008)">Aus zwei mach eins: Wie man zwei Cursor kombinieren kann</a> (5)</li>
	<li><a href="http://blog.m-ri.de/index.php/2009/08/09/vs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version/" title="VS-Tipps&#038;Tricks: Einfache Debug-Ausgabe mit TRACE auch in der Release Version (So 09. Aug 2009)">VS-Tipps&#038;Tricks: Einfache Debug-Ausgabe mit TRACE auch in der Release Version</a> (9)</li>
	<li><a href="http://blog.m-ri.de/index.php/2008/11/04/vs-tipps-tricks-heap-bugs-finden-teil-3/" title="VS Tipps &#038; Tricks: Heap Bugs finden (Teil 3) (Di 04. Nov 2008)">VS Tipps &#038; Tricks: Heap Bugs finden (Teil 3)</a> (0)</li>
</ul>

]]></description>
		<wfw:commentRss>http://blog.m-ri.de/index.php/2010/01/04/cdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>AfxMessageBox versus CWnd::MessageBox</title>
		<link>http://blog.m-ri.de/index.php/2009/12/03/afxmessagebox-versus-cwndmessagebox/</link>
		<comments>http://blog.m-ri.de/index.php/2009/12/03/afxmessagebox-versus-cwndmessagebox/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 19:57:55 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[VS-2003]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[VS-2010]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=501</guid>
		<description><![CDATA[<p>Jeder MFC Entwickler kennt <em>AfxMessageBox</em>. In der Klasse CWnd finden wir auch die Memberfunktion <em>CWnd::MessageBox</em>.<br />
Mancher Entwickler wird sich nun fragen: Wann nehme ich denn nun was?</p>
<p><strong>Kurze Antwort: Meide <em>CWnd::MessageBox </em>und nutze immer <em>AfxMessageBox </em> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </strong></p>
<p><strong>Lange Antwort:<br />
</strong>CWnd::MessageBox ist einfach nur ein direkter Wrapper für Windows API Funktion <em>MessageBox</em>.<br />
Der Grund warum man <em>AfxMessageBox </em>verwenden sollte liegt darin was <em>AfxMessageBox </em>einfach noch mehr leistet:</p>
<ol>
<li><em>AfxMessageBox </em>benutzt die virtuelle Funktion <em>CWinApp::DoMessageBox</em>. Damit kann man zentral eine andere Behandlung für Fehlermeldungen einbauen.</li>
<li><em>AfxMessageBox </em>sorgt dafür, dass OLE Controls benachrichtigt werden, dass Ihre nicht modalen Dialoge nun deaktiviert werden müssen. Es wäre ja ziemlich heftig, wenn man solche Dialoge trotz aktiver MessageBox noch benutzen könnte. (siehe <em>CWinApp::DoEnableModeless </em>und Implementierung von <em>CWnd::GetSafeOwner</em>)</li>
<li><em>CWnd::MessageBox </em>benutzt das aktuelle Fensterhandle aus dem es aufgerufen wird als Parent-Handle für die API Funktion MessageBox. Die wenigsten Entwickler kennen, lesen oder beachten den netten Zusatz in der <em>MessageBox </em><a href="http://msdn.microsoft.com/en-us/library/ms645505(VS.85).aspx">Doku</a>:<br />
<em><strong>If you create a message box while a dialog box is present, use the handle of the dialog box as the hWnd parameter. The hWnd parameter should not identify a child window, such as a control in a dialog box.</strong><br />
</em>Es ist also gerade zulässig <em>CWnd::MessageBox </em>aufzurufen, denn oft genug haben wir es mit Child-Windows zu tun.<br />
Netterweise beachtet <em>AfxMessageBox </em>genau das. Es ermittelt das aktuelle aktive Top-Level Fenster und setzt es intern für den Aufruf von MessageBox.<br />
Das wird auch ganz besonders wichtig, wenn man evtl. mehrere UI Threads hat. <em>AfxMessageBox</em> verwendet automatisch den richtigen. <em>CWnd::MessageBox </em>verwendet den aktuellen Thread aber evtl. als Fenster das Fenster-Handle aus einem anderen Threads.</li>
<li><em>CWnd:MessageBox </em>hat keine Implementierung für die <em>F1</em>-Taste und die Hilfeimplementierung der MFC.</li>
<li>Ich muss mich nicht um den Titel der <em>MessageBox </em>kümmern, denn <em>AfxMessageBox </em>benutzt den hinterlegten Applikationsnamen (<em>CWinApp::m_pszAppName</em>) der in der MFC hinterlegt und definiert wurde.</li>
<li>Netterweise setzt AfxMessageBox passende Icons wenn nur die Reaktionsform definiert wird, also kein Icon. (<em>MB_OK</em> und <em>MB_OKCANCEL</em> benutzt <em>MB_ICONEXCLAMATION</em>, <em>MB_YESNO </em>und <em>MB_YESNOCANCEL </em>benutzt <em>MB_ICONQUESTION</em>).</li>
</ol>
<p>HTH</p>
<hr /><small>Copyright &copy; 2008 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>
<div class="sociable">

<ul>
	<li class="sociablefirst"><a rel="nofollow"  href="javascript:AddToFavorites();" title="Add to favorites"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/addtofavorites.png" title="Add to favorites" alt="Add to favorites" /></a></li>
	<li><a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F12%2F03%2Fafxmessagebox-versus-cwndmessagebox%2F&amp;title=AfxMessageBox%20versus%20CWnd%3A%3AMessageBox&amp;annotation=Jeder%20MFC%20Entwickler%20kennt%20AfxMessageBox.%20In%20der%20Klasse%20CWnd%20finden%20wir%20auch%20die%20Memberfunktion%20CWnd%3A%3AMessageBox.%0D%0AMancher%20Entwickler%20wird%20sich%20nun%20fragen%3A%20Wann%20nehme%20ich%20denn%20nun%20was%3F%0D%0A%0D%0AKurze%20Antwort%3A%20Meide%20CWnd%3A%3AMessageBox%20und%20nutze%20immer%20AfxMessa" title="Google Bookmarks"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" /></a></li>
	<li><a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F12%2F03%2Fafxmessagebox-versus-cwndmessagebox%2F&amp;title=AfxMessageBox%20versus%20CWnd%3A%3AMessageBox&amp;notes=Jeder%20MFC%20Entwickler%20kennt%20AfxMessageBox.%20In%20der%20Klasse%20CWnd%20finden%20wir%20auch%20die%20Memberfunktion%20CWnd%3A%3AMessageBox.%0D%0AMancher%20Entwickler%20wird%20sich%20nun%20fragen%3A%20Wann%20nehme%20ich%20denn%20nun%20was%3F%0D%0A%0D%0AKurze%20Antwort%3A%20Meide%20CWnd%3A%3AMessageBox%20und%20nutze%20immer%20AfxMessa" title="del.icio.us"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" /></a></li>
	<li><a rel="nofollow"  href="http://www.mister-wong.de/addurl/?bm_url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F12%2F03%2Fafxmessagebox-versus-cwndmessagebox%2F&amp;bm_description=AfxMessageBox%20versus%20CWnd%3A%3AMessageBox&amp;plugin=soc" title="MisterWong.DE"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/misterwong.png" title="MisterWong.DE" alt="MisterWong.DE" /></a></li>
	<li><a rel="nofollow"  href="http://technorati.com/faves?add=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F12%2F03%2Fafxmessagebox-versus-cwndmessagebox%2F" title="Technorati"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" /></a></li>
	<li><a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F12%2F03%2Fafxmessagebox-versus-cwndmessagebox%2F&amp;t=AfxMessageBox%20versus%20CWnd%3A%3AMessageBox" title="Facebook"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" /></a></li>
	<li><a rel="nofollow"  href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F12%2F03%2Fafxmessagebox-versus-cwndmessagebox%2F&amp;title=AfxMessageBox%20versus%20CWnd%3A%3AMessageBox" title="Live"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" /></a></li>
	<li class="sociablelast"><a rel="nofollow"  href="http://twitter.com/home?status=AfxMessageBox%20versus%20CWnd%3A%3AMessageBox%20-%20http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F12%2F03%2Fafxmessagebox-versus-cwndmessagebox%2F" title="Twitter"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" /></a></li>
</ul>
</div>

	<h4>Themenverwandte Beiträge:</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.m-ri.de/index.php/2009/12/21/vs-tipps-tricks-springe-zur-naechsten-klammer-funktioniert-auch-fuer-if-elif-else-und-endif/" title="VS-Tipps &#038; Tricks: Springe zur nächsten Klammer funktioniert auch für #if, #elif, #else und #endif (Mo 21. Dez 2009)">VS-Tipps &#038; Tricks: Springe zur nächsten Klammer funktioniert auch für #if, #elif, #else und #endif</a> (1)</li>
	<li><a href="http://blog.m-ri.de/index.php/2010/07/25/mfc-next-9-0-mfc-10-0-denn-cmfcribbonpanelenablelaunchbutton-gibt-es-nicht-mehr/" title="MFC-Next 9.0 > MFC 10.0 denn CMFCRibbonPanel::EnableLaunchButton gibt es nicht mehr (So 25. Jul 2010)">MFC-Next 9.0 > MFC 10.0 denn CMFCRibbonPanel::EnableLaunchButton gibt es nicht mehr</a> (1)</li>
	<li><a href="http://blog.m-ri.de/index.php/2009/07/29/die-mfc-erhaelt-mit-vc-2010-jetzt-eine-neue-hashkey-implementierung/" title="Die MFC erhält mit VC-2010 jetzt eine neue HashKey Implementierung (Mi 29. Jul 2009)">Die MFC erhält mit VC-2010 jetzt eine neue HashKey Implementierung</a> (1)</li>
</ul>

]]></description>
		<wfw:commentRss>http://blog.m-ri.de/index.php/2009/12/03/afxmessagebox-versus-cwndmessagebox/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Crash durch unsachgemäßen Umgang mit PreTranslateMessage</title>
		<link>http://blog.m-ri.de/index.php/2009/09/05/crash-durch-unsachgemaessen-umgang-mit-pretranslatemessage/</link>
		<comments>http://blog.m-ri.de/index.php/2009/09/05/crash-durch-unsachgemaessen-umgang-mit-pretranslatemessage/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 08:52:18 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=408</guid>
		<description><![CDATA[<p>Neulich bei einem Codereview, lief mir Code in den beiden nachfolgenden Formen über meinen Monitor:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL CMyDialog<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>MSG <span style="color: #000040;">*</span>pMsg<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Translate Messages (ON_KEYDOWN -&gt; ON_COMMAND)</span>
    TranslateAccelerator<span style="color: #008000;">&#40;</span>m_hWnd,m_hAccel,pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">// Let the ToolTip process this message.</span>
    m_tooltip.<span style="color: #007788;">RelayEvent</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> __super<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>- bzw.  -</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL CMyWnd<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>MSG <span style="color: #000040;">*</span>pMsg<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  BOOL bResult <span style="color: #000080;">=</span> __super<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  DoSomething<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> bResult<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Sieht OK aus, aber hier tritt ein grundsätzliches Problem auf:</p>
<p>In beiden Funktionen wird evtl. eine Nachricht behandelt. Allerdings wird in diesem Fall nicht umgehend die Funktion verlassen. Durch das Behandeln der Nachricht kann nämlich das Fenster/Objekt, zu dem <em>PreTranslateMessage</em> gehört, bereits zerstört sein. In diesem Fall kehrt <em>PreTranslateMessage</em> zurück und der <em>this</em> Zeiger ist bereits ungültig.</p>
<p>Es ist also imminent wichtig in dem Moment in dem erkannt wird, dass die Nachricht behandelt wurde, auch umgehend die Funktion mit TRUE zu verlassen und keine weitere Memberfunktion oder gar Membervariable mehr zu nutzen. Beides könnte zu einem üblen Crash führen.</p>
<p>Der korrekte Code sähe also so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL CMyDialog<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>MSG <span style="color: #000040;">*</span>pMsg<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Translate Messages (ON_KEYDOWN -&gt; ON_COMMAND)</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>TranslateAccelerator<span style="color: #008000;">&#40;</span>m_hWnd,m_hAccel,pMsg<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> TRUE<span style="color: #008080;">;</span>
  <span style="color: #666666;">// Let the ToolTip process this message.</span>
  m_tooltip.<span style="color: #007788;">RelayEvent</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> __super<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>- oder -</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL CMyWnd<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>MSG <span style="color: #000040;">*</span>pMsg<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>__super<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> TRUE<span style="color: #008080;">;</span>
  DoSomething<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> FALSE<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p lang="cpp">PS: Beide Codeteile wurden durch Crashdumps aus <a href="https://winqual.microsoft.com/">WinQual </a>gefunden. Regelmäßig, alle 2 Monate schaue ich mir Dumps an, von den Top-Crashes, die dort verzeichnet sind, und mache entsprechende Code-Reviews.<br />
Der erste Code, stammte aus einem speziellen nicht modalen Dialog, der durch Drücken bestimmter Tastenkombinationen geschlossen und zerstört wurde.<br />
Der zweite Code stammte aus einem Popup-Fenster, dass auch durch Mausaktivitäten oder Tastendrücke zerstört wurde.<br />
Ich kann jedem nur raten WinQual auch zu nutzen, es dient der Qualtitätssicherung und man findet viele kleine Bugs, die manchen User ärgern, die aber nie sonst gemeldet würden.</p>
<hr /><small>Copyright &copy; 2008 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>
<div class="sociable">

<ul>
	<li class="sociablefirst"><a rel="nofollow"  href="javascript:AddToFavorites();" title="Add to favorites"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/addtofavorites.png" title="Add to favorites" alt="Add to favorites" /></a></li>
	<li><a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F09%2F05%2Fcrash-durch-unsachgemaessen-umgang-mit-pretranslatemessage%2F&amp;title=Crash%20durch%20unsachgem%C3%A4%C3%9Fen%20Umgang%20mit%20PreTranslateMessage&amp;annotation=Neulich%20bei%20einem%20Codereview%2C%20lief%20mir%20Code%20in%20den%20beiden%20nachfolgenden%20Formen%20%C3%BCber%20meinen%20Monitor%3A%0D%0ABOOL%20CMyDialog%3A%3APreTranslateMessage%28MSG%20%2ApMsg%29%0D%0A%7B%0D%0A%20%20%20%20%2F%2F%20Translate%20Messages%20%28ON_KEYDOWN%20-%26gt%3B%20ON_COMMAND%29%0D%0A%20%20%20%20TranslateAccelerator%28m_hWnd%2Cm_hAccel" title="Google Bookmarks"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" /></a></li>
	<li><a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F09%2F05%2Fcrash-durch-unsachgemaessen-umgang-mit-pretranslatemessage%2F&amp;title=Crash%20durch%20unsachgem%C3%A4%C3%9Fen%20Umgang%20mit%20PreTranslateMessage&amp;notes=Neulich%20bei%20einem%20Codereview%2C%20lief%20mir%20Code%20in%20den%20beiden%20nachfolgenden%20Formen%20%C3%BCber%20meinen%20Monitor%3A%0D%0ABOOL%20CMyDialog%3A%3APreTranslateMessage%28MSG%20%2ApMsg%29%0D%0A%7B%0D%0A%20%20%20%20%2F%2F%20Translate%20Messages%20%28ON_KEYDOWN%20-%26gt%3B%20ON_COMMAND%29%0D%0A%20%20%20%20TranslateAccelerator%28m_hWnd%2Cm_hAccel" title="del.icio.us"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" /></a></li>
	<li><a rel="nofollow"  href="http://www.mister-wong.de/addurl/?bm_url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F09%2F05%2Fcrash-durch-unsachgemaessen-umgang-mit-pretranslatemessage%2F&amp;bm_description=Crash%20durch%20unsachgem%C3%A4%C3%9Fen%20Umgang%20mit%20PreTranslateMessage&amp;plugin=soc" title="MisterWong.DE"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/misterwong.png" title="MisterWong.DE" alt="MisterWong.DE" /></a></li>
	<li><a rel="nofollow"  href="http://technorati.com/faves?add=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F09%2F05%2Fcrash-durch-unsachgemaessen-umgang-mit-pretranslatemessage%2F" title="Technorati"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" /></a></li>
	<li><a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F09%2F05%2Fcrash-durch-unsachgemaessen-umgang-mit-pretranslatemessage%2F&amp;t=Crash%20durch%20unsachgem%C3%A4%C3%9Fen%20Umgang%20mit%20PreTranslateMessage" title="Facebook"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" /></a></li>
	<li><a rel="nofollow"  href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F09%2F05%2Fcrash-durch-unsachgemaessen-umgang-mit-pretranslatemessage%2F&amp;title=Crash%20durch%20unsachgem%C3%A4%C3%9Fen%20Umgang%20mit%20PreTranslateMessage" title="Live"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" /></a></li>
	<li class="sociablelast"><a rel="nofollow"  href="http://twitter.com/home?status=Crash%20durch%20unsachgem%C3%A4%C3%9Fen%20Umgang%20mit%20PreTranslateMessage%20-%20http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F09%2F05%2Fcrash-durch-unsachgemaessen-umgang-mit-pretranslatemessage%2F" title="Twitter"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" /></a></li>
</ul>
</div>

	<h4>Themenverwandte Beiträge:</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.m-ri.de/index.php/2009/08/09/vs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version/" title="VS-Tipps&#038;Tricks: Einfache Debug-Ausgabe mit TRACE auch in der Release Version (So 09. Aug 2009)">VS-Tipps&#038;Tricks: Einfache Debug-Ausgabe mit TRACE auch in der Release Version</a> (9)</li>
	<li><a href="http://blog.m-ri.de/index.php/2009/08/30/vs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert/" title="VS-Tipps &#038; Tricks: Direkter Break in den Debugger bei einem ASSERT (So 30. Aug 2009)">VS-Tipps &#038; Tricks: Direkter Break in den Debugger bei einem ASSERT</a> (1)</li>
	<li><a href="http://blog.m-ri.de/index.php/2008/11/27/vs-tipps-tricks-heap-bugs-finden-teil-4/" title="VS Tipps &#038; Tricks: Heap Bugs finden (Teil 4) (Do 27. Nov 2008)">VS Tipps &#038; Tricks: Heap Bugs finden (Teil 4)</a> (0)</li>
</ul>

]]></description>
		<wfw:commentRss>http://blog.m-ri.de/index.php/2009/09/05/crash-durch-unsachgemaessen-umgang-mit-pretranslatemessage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VS-Tipps &amp; Tricks: Direkter Break in den Debugger bei einem ASSERT</title>
		<link>http://blog.m-ri.de/index.php/2009/08/30/vs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert/</link>
		<comments>http://blog.m-ri.de/index.php/2009/08/30/vs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 14:10:31 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[Tipps&Tricks]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=509</guid>
		<description><![CDATA[<p><em>ASSERTs</em> in der <em>MFC </em>und in der <em>CRT </em>sind tolle Hilfsmittel, aber nicht selten verfälschen sie auch das Problem alleine dadurch, dass ein Fenster aufpoppt, wenn der <em>ASSERT </em>zuschlägt. Hat man nun einen Code, der in einem Tooltipp etwas Böses macht, dann wird der Tooltipp selbst aber schon wieder durch das erscheinen der <em>ASSERT </em>Meldung zerstört. Oder es wird ein neuer ASSERT ausgelöst. Der Callstack wird dadurch oft schwer zu lesen.<br />
Besonders heikel kann dies auch noch werden wenn man mehrere Threads hat. Gleichfalls problematisch ist, dass in dem Moment in dem die ASSERT Box auftaucht nun auch wieder alle Timer weiterlaufen und sehr eigentümliche Seiteneffekte weiter auslösen können, dito. Probleme in WM_PAINT Handlern, denn auch die lösen evtl. schon wieder Aktionen aus, die Variablen verändern.</p>
<p>Nett ist am ASSERT-Dialog natürlich die Möglichkeit Ignorieren zu sagen und das Programm weiter laufen zu lassen. Ganz besonders wenn man Debug Versionen im Testfeld mit Anwendern testet.</p>
<p>Dennoch bin ich bei Debug-Versionen dazu übergegangen <em>ASSERTs</em> direkt  crashen zu lassen, bzw. direkt einen Debug-Break auszulösen. Das erleichtert das Lesen des Crashdumps bzw. hilft auch beim Debuggen, weil man direkt an der Stelle steht wo es hakt und alle Fenster und Variableninhalte exakt noch so sind, wie Sie es beim Auftreten des Problems waren (Tooltips, Popups, Menüs etc.).</p>
<p>Der Code um das zu erreichen ist relativ simpel. Man verwendet dazu <a href="http://msdn.microsoft.com/en-us/library/94a21kwy(VS.80).aspx">_CrtSetReportHook2</a>. In dem Hook sagt man einfach was man gerne hätte. Nämlich bei einem <em>ASSERT</em> oder <em>ERROR</em> keinen Dialog sondern einen Break (<em>INT3</em>).</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#ifdef _DEBUG</span>
<span style="color: #0000ff;">int</span> __cdecl DebugReportHook<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> nReportType, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> , <span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> pnRet<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Stop if no debugger is loaded and do not assert, cause a crash</span>
  <span style="color: #666666;">// - returning TRUE indicates that we handled the problem, so no other hook</span>
  <span style="color: #666666;">//   needs to perform any action</span>
  <span style="color: #666666;">// - setting the target of *pnRet to TRUE indicates that the CRT should</span>
  <span style="color: #666666;">//   execute an INT3 and should crash or break into the debugger.</span>
  <span style="color: #0000ff;">return</span> <span style="color: #000040;">*</span>pnRet <span style="color: #000080;">=</span> nReportType<span style="color: #000080;">==</span>_CRT_ASSERT <span style="color: #000040;">||</span>
                  nReportType<span style="color: #000080;">==</span>_CRT_ERROR <span style="color: #008080;">?</span>
                            TRUE <span style="color: #008080;">:</span> FALSE<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #339900;">#endif</span>
&nbsp;
<span style="color: #0000ff;">void</span> SetBreakOnAssert<span style="color: #008000;">&#40;</span>BOOL bBreakOnAssert<span style="color: #ff0000; font-style: italic;">/* =FALSE */</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>  
<span style="color: #666666;">// Need to disable the ASSERT handler?</span>
<span style="color: #339900;">#ifdef _DEBUG  </span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>bBreakOnAssert<span style="color: #008000;">&#41;</span>   
    _CrtSetReportHook2<span style="color: #008000;">&#40;</span>_CRT_RPTHOOK_INSTALL, DebugReportHook<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
  <span style="color: #0000ff;">else</span>   
    _CrtSetReportHook2<span style="color: #008000;">&#40;</span>_CRT_RPTHOOK_REMOVE, DebugReportHook<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #339900;">#else</span>
  UNUSED_ALWAYS<span style="color: #008000;">&#40;</span>bBreakOnAssert<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #339900;">#endif</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Durch diese kleine Funktion <em>SetBreakOnAssert</em> kann man dieses Verhalten nun einfach ein- und ausschalten. Nähere Details stehen im Kommentar der Hook-Funktion.</p>
<hr /><small>Copyright &copy; 2008 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>
<div class="sociable">

<ul>
	<li class="sociablefirst"><a rel="nofollow"  href="javascript:AddToFavorites();" title="Add to favorites"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/addtofavorites.png" title="Add to favorites" alt="Add to favorites" /></a></li>
	<li><a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F30%2Fvs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert%2F&amp;title=VS-Tipps%20%26%20Tricks%3A%20Direkter%20Break%20in%20den%20Debugger%20bei%20einem%20ASSERT&amp;annotation=ASSERTs%20in%20der%20MFC%20und%20in%20der%20CRT%20sind%20tolle%20Hilfsmittel%2C%20aber%20nicht%20selten%20verf%C3%A4lschen%20sie%20auch%20das%20Problem%20alleine%20dadurch%2C%20dass%20ein%20Fenster%20aufpoppt%2C%20wenn%20der%20ASSERT%20zuschl%C3%A4gt.%20Hat%20man%20nun%20einen%20Code%2C%20der%20in%20einem%20Tooltipp%20etwas%20B%C3%B6ses%20macht%2C%20da" title="Google Bookmarks"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" /></a></li>
	<li><a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F30%2Fvs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert%2F&amp;title=VS-Tipps%20%26%20Tricks%3A%20Direkter%20Break%20in%20den%20Debugger%20bei%20einem%20ASSERT&amp;notes=ASSERTs%20in%20der%20MFC%20und%20in%20der%20CRT%20sind%20tolle%20Hilfsmittel%2C%20aber%20nicht%20selten%20verf%C3%A4lschen%20sie%20auch%20das%20Problem%20alleine%20dadurch%2C%20dass%20ein%20Fenster%20aufpoppt%2C%20wenn%20der%20ASSERT%20zuschl%C3%A4gt.%20Hat%20man%20nun%20einen%20Code%2C%20der%20in%20einem%20Tooltipp%20etwas%20B%C3%B6ses%20macht%2C%20da" title="del.icio.us"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" /></a></li>
	<li><a rel="nofollow"  href="http://www.mister-wong.de/addurl/?bm_url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F30%2Fvs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert%2F&amp;bm_description=VS-Tipps%20%26%20Tricks%3A%20Direkter%20Break%20in%20den%20Debugger%20bei%20einem%20ASSERT&amp;plugin=soc" title="MisterWong.DE"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/misterwong.png" title="MisterWong.DE" alt="MisterWong.DE" /></a></li>
	<li><a rel="nofollow"  href="http://technorati.com/faves?add=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F30%2Fvs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert%2F" title="Technorati"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" /></a></li>
	<li><a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F30%2Fvs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert%2F&amp;t=VS-Tipps%20%26%20Tricks%3A%20Direkter%20Break%20in%20den%20Debugger%20bei%20einem%20ASSERT" title="Facebook"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" /></a></li>
	<li><a rel="nofollow"  href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F30%2Fvs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert%2F&amp;title=VS-Tipps%20%26%20Tricks%3A%20Direkter%20Break%20in%20den%20Debugger%20bei%20einem%20ASSERT" title="Live"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" /></a></li>
	<li class="sociablelast"><a rel="nofollow"  href="http://twitter.com/home?status=VS-Tipps%20%26%20Tricks%3A%20Direkter%20Break%20in%20den%20Debugger%20bei%20einem%20ASSERT%20-%20http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F30%2Fvs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert%2F" title="Twitter"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" /></a></li>
</ul>
</div>

	<h4>Themenverwandte Beiträge:</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.m-ri.de/index.php/2008/11/04/vs-tipps-tricks-heap-bugs-finden-teil-3/" title="VS Tipps &#038; Tricks: Heap Bugs finden (Teil 3) (Di 04. Nov 2008)">VS Tipps &#038; Tricks: Heap Bugs finden (Teil 3)</a> (0)</li>
	<li><a href="http://blog.m-ri.de/index.php/2008/10/31/vs-tipps-tricks-heap-bugs-finden-teil-2/" title="VS Tipps &#038; Tricks: Heap Bugs finden (Teil 2) (Fr 31. Okt 2008)">VS Tipps &#038; Tricks: Heap Bugs finden (Teil 2)</a> (4)</li>
	<li><a href="http://blog.m-ri.de/index.php/2009/06/07/wie-man-einen-permanenten-assert-direkt-mit-einem-kommentar-versieht/" title="Tipps &#038; Tricks: Wie man einen permanenten ASSERT direkt mit einem Kommentar versieht (So 07. Jun 2009)">Tipps &#038; Tricks: Wie man einen permanenten ASSERT direkt mit einem Kommentar versieht</a> (1)</li>
</ul>

]]></description>
		<wfw:commentRss>http://blog.m-ri.de/index.php/2009/08/30/vs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VS-Tipps&amp;Tricks: Einfache Debug-Ausgabe mit TRACE auch in der Release Version</title>
		<link>http://blog.m-ri.de/index.php/2009/08/09/vs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version/</link>
		<comments>http://blog.m-ri.de/index.php/2009/08/09/vs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 16:50:15 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Debugging]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=490</guid>
		<description><![CDATA[<p>Wer wollte nicht schon immer mal gerne <em>TRACE (Debug)</em>-Ausgaben in seinem Release Programm haben ohne dafür überall <em>OutputDebugString </em>reinschreiben zu müssen.</p>
<p>Die nachfolgene kleine Klasse macht es möglich, den gewohnten Syntax des <em>MFC TRACE </em>Makros zu verwenden und direkt auf die Debugausgabe umzuleiten:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//    CTraceToOutputDebugString</span>
<span style="color: #666666;">//        Is a nice replacment class for TRACE</span>
<span style="color: #666666;">//        Easy to use with:</span>
<span style="color: #666666;">//            #undef TRACE</span>
<span style="color: #666666;">//            #define TRACE    CTraceToOutputDebugString()</span>
&nbsp;
<span style="color: #0000ff;">class</span> CTraceToOutputDebugString
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #666666;">// Non Unicode output helper</span>
    <span style="color: #0000ff;">void</span> operator<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>PCSTR pszFormat, ...<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">va_list</span> ptr<span style="color: #008080;">;</span>
        <span style="color: #0000dd;">va_start</span><span style="color: #008000;">&#40;</span>ptr, pszFormat<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        TraceV<span style="color: #008000;">&#40;</span>pszFormat,ptr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000dd;">va_end</span><span style="color: #008000;">&#40;</span>ptr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #666666;">// Unicode output helper</span>
    <span style="color: #0000ff;">void</span> operator<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>PCWSTR pszFormat, ...<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">va_list</span> ptr<span style="color: #008080;">;</span>
        <span style="color: #0000dd;">va_start</span><span style="color: #008000;">&#40;</span>ptr, pszFormat<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        TraceV<span style="color: #008000;">&#40;</span>pszFormat,ptr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000dd;">va_end</span><span style="color: #008000;">&#40;</span>ptr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    <span style="color: #666666;">// Non Unicode output helper</span>
    <span style="color: #0000ff;">void</span> TraceV<span style="color: #008000;">&#40;</span>PCSTR pszFormat, <span style="color: #0000ff;">va_list</span> args<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">// Format the output buffer</span>
        <span style="color: #0000ff;">char</span> szBuffer<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1024</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        _vsnprintf<span style="color: #008000;">&#40;</span>szBuffer, _countof<span style="color: #008000;">&#40;</span>szBuffer<span style="color: #008000;">&#41;</span>, pszFormat, args<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        OutputDebugStringA<span style="color: #008000;">&#40;</span>szBuffer<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #666666;">// Unicode output helper</span>
    <span style="color: #0000ff;">void</span> TraceV<span style="color: #008000;">&#40;</span>PCWSTR pszFormat, <span style="color: #0000ff;">va_list</span> args<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">wchar_t</span> szBuffer<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1024</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        _vsnwprintf<span style="color: #008000;">&#40;</span>szBuffer, _countof<span style="color: #008000;">&#40;</span>szBuffer<span style="color: #008000;">&#41;</span>, pszFormat, args<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        OutputDebugStringW<span style="color: #008000;">&#40;</span>szBuffer<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div>

<p>Durch den obenstehenden Code kann man auch in einer Release Version Trace Ausgaben erzeugen und z.B. mit <a href="http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx">DebugView.exe (Sysinternals)</a> sichtbar machen, ohne evtl. weitere Anpassungen vornehmen zu müssen:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Activate my special tracer</span>
<span style="color: #339900;">#undef TRACE</span>
<span style="color: #339900;">#define TRACE    CTraceToOutputDebugString()</span>
&nbsp;
<span style="color: #0000ff;">void</span> Foo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
     <span style="color: #666666;">// Sometime usefull to see the output in a release version too</span>
     TRACE<span style="color: #008000;">&#40;</span>__FUNCTION__ <span style="color: #FF0000;">&quot; called at %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, GetTickCount<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<hr /><small>Copyright &copy; 2008 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>
<div class="sociable">

<ul>
	<li class="sociablefirst"><a rel="nofollow"  href="javascript:AddToFavorites();" title="Add to favorites"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/addtofavorites.png" title="Add to favorites" alt="Add to favorites" /></a></li>
	<li><a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F09%2Fvs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version%2F&amp;title=VS-Tipps%26Tricks%3A%20Einfache%20Debug-Ausgabe%20mit%20TRACE%20auch%20in%20der%20Release%20Version&amp;annotation=Wer%20wollte%20nicht%20schon%20immer%20mal%20gerne%20TRACE%20%28Debug%29-Ausgaben%20in%20seinem%20Release%20Programm%20haben%20ohne%20daf%C3%BCr%20%C3%BCberall%20OutputDebugString%20reinschreiben%20zu%20m%C3%BCssen.%0D%0A%0D%0ADie%20nachfolgene%20kleine%20Klasse%20macht%20es%20m%C3%B6glich%2C%20den%20gewohnten%20Syntax%20des%20MFC%20TRACE%20Mak" title="Google Bookmarks"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" /></a></li>
	<li><a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F09%2Fvs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version%2F&amp;title=VS-Tipps%26Tricks%3A%20Einfache%20Debug-Ausgabe%20mit%20TRACE%20auch%20in%20der%20Release%20Version&amp;notes=Wer%20wollte%20nicht%20schon%20immer%20mal%20gerne%20TRACE%20%28Debug%29-Ausgaben%20in%20seinem%20Release%20Programm%20haben%20ohne%20daf%C3%BCr%20%C3%BCberall%20OutputDebugString%20reinschreiben%20zu%20m%C3%BCssen.%0D%0A%0D%0ADie%20nachfolgene%20kleine%20Klasse%20macht%20es%20m%C3%B6glich%2C%20den%20gewohnten%20Syntax%20des%20MFC%20TRACE%20Mak" title="del.icio.us"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" /></a></li>
	<li><a rel="nofollow"  href="http://www.mister-wong.de/addurl/?bm_url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F09%2Fvs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version%2F&amp;bm_description=VS-Tipps%26Tricks%3A%20Einfache%20Debug-Ausgabe%20mit%20TRACE%20auch%20in%20der%20Release%20Version&amp;plugin=soc" title="MisterWong.DE"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/misterwong.png" title="MisterWong.DE" alt="MisterWong.DE" /></a></li>
	<li><a rel="nofollow"  href="http://technorati.com/faves?add=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F09%2Fvs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version%2F" title="Technorati"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" /></a></li>
	<li><a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F09%2Fvs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version%2F&amp;t=VS-Tipps%26Tricks%3A%20Einfache%20Debug-Ausgabe%20mit%20TRACE%20auch%20in%20der%20Release%20Version" title="Facebook"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" /></a></li>
	<li><a rel="nofollow"  href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F09%2Fvs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version%2F&amp;title=VS-Tipps%26Tricks%3A%20Einfache%20Debug-Ausgabe%20mit%20TRACE%20auch%20in%20der%20Release%20Version" title="Live"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" /></a></li>
	<li class="sociablelast"><a rel="nofollow"  href="http://twitter.com/home?status=VS-Tipps%26Tricks%3A%20Einfache%20Debug-Ausgabe%20mit%20TRACE%20auch%20in%20der%20Release%20Version%20-%20http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F09%2Fvs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version%2F" title="Twitter"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" /></a></li>
</ul>
</div>

	<h4>Themenverwandte Beiträge:</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.m-ri.de/index.php/2008/11/04/vs-tipps-tricks-heap-bugs-finden-teil-3/" title="VS Tipps &#038; Tricks: Heap Bugs finden (Teil 3) (Di 04. Nov 2008)">VS Tipps &#038; Tricks: Heap Bugs finden (Teil 3)</a> (0)</li>
	<li><a href="http://blog.m-ri.de/index.php/2008/10/31/vs-tipps-tricks-heap-bugs-finden-teil-2/" title="VS Tipps &#038; Tricks: Heap Bugs finden (Teil 2) (Fr 31. Okt 2008)">VS Tipps &#038; Tricks: Heap Bugs finden (Teil 2)</a> (4)</li>
	<li><a href="http://blog.m-ri.de/index.php/2008/11/27/vs-tipps-tricks-heap-bugs-finden-teil-4/" title="VS Tipps &#038; Tricks: Heap Bugs finden (Teil 4) (Do 27. Nov 2008)">VS Tipps &#038; Tricks: Heap Bugs finden (Teil 4)</a> (0)</li>
</ul>

]]></description>
		<wfw:commentRss>http://blog.m-ri.de/index.php/2009/08/09/vs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>CMapStringTo&#8230; HashKey Implementierung in VC-2003/5/8 ist auch fragwürdig</title>
		<link>http://blog.m-ri.de/index.php/2009/08/01/cmapstringto-hashkey-implementierung-in-vc-200358-ist-auch-fragwuerdig/</link>
		<comments>http://blog.m-ri.de/index.php/2009/08/01/cmapstringto-hashkey-implementierung-in-vc-200358-ist-auch-fragwuerdig/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 16:26:28 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=502</guid>
		<description><![CDATA[<p> Hash-Algorithmen haben es mir irgendwie angetan. 1984 hatte ich das erste mal mit einem miesen Hashverfahren zu tun, das einfach versagte wenn es nur um Ziffern ging. Das ganze betraf das Betriebssystem OASIS (später TheOS) und dessen Index Dateiorganisation. Ich entwickelte hierfür einen Patch in Assembler, der damals exakt in den x-Bytes der Kernels in Z80 Assembler passen musste.<br />
Das Problem bei Strings die nur aus Ziffern bestehen ist das die Veränderung, die immer nur die unteren 4 Bits betrifft und die höheren 4 Bits immer konstant sind mit 3 belegt sind.</p>
<p>Als ich gelesen habe,  dass in VS-2010 die CMap Implementierung nun auch für Strings den selben Algorithmus aus der STL erhalten, habe ich mir auch den mal genauer angesehen. (siehe Beitrag <a title="Permanent Link: Die MFC erhält mit VC-2010 jetzt eine neue HashKey Implementierung" rel="bookmark" href="http://blog.m-ri.de/index.php/2009/07/29/die-mfc-erhaelt-mit-vc-2010-jetzt-eine-neue-hashkey-implementierung/">Die MFC erhält mit VC-2010 jetzt eine neue HashKey Implementierung</a>)<br />
Der sieht so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">inline</span> UINT CMapStringToString<span style="color: #008080;">::</span><span style="color: #007788;">HashKey</span><span style="color: #008000;">&#40;</span>LPCTSTR key<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
  UINT nHash <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>key <span style="color: #000080;">==</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    AfxThrowInvalidArgException<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
 
  <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>key<span style="color: #008000;">&#41;</span>
    nHash <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>nHash<span style="color: #000080;">&lt;&lt;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> nHash <span style="color: #000040;">+</span> <span style="color: #000040;">*</span>key<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> nHash<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Und auch in diesem Fall muss ich sagen, dass der Algorithmus nur scheinbar intelligent ist. Wenn man sich aber die Abstände die hier erzeugt werden etwas genauer anschaut kommt man schnell auf eine Wertekombination, in der der Algorithmus versagt.<br />
Wie sehr er versagt zeigt das folgende Beispiel, in dem ich einfach einen String verwende der aus 5 Ziffern besteht und immer den Abstand 11 verwendet.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">CMapStringToPtr myMap<span style="color: #008080;">;</span>
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">1000</span><span style="color: #008080;">;</span> i<span style="color: #000040;">+</span><span style="color: #000080;">=</span><span style="color: #0000dd;">11</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  CString strKey<span style="color: #008080;">;</span>
  strKey.<span style="color: #007788;">Format</span><span style="color: #008000;">&#40;</span>_T<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%05d&quot;</span><span style="color: #008000;">&#41;</span>,i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  myMap<span style="color: #008000;">&#91;</span>strKey<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Das erschreckende Ergebnis der Verteilung ist bei einem Unicode wie auch MBCS Projekt:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">TMyMap<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> CMapStringToPtr<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">DumpMap</span>
Bucket  <span style="color: #0000dd;">0</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket  <span style="color: #0000dd;">1</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket  <span style="color: #0000dd;">2</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket  <span style="color: #0000dd;">3</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket  <span style="color: #0000dd;">4</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket  <span style="color: #0000dd;">5</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket  <span style="color: #0000dd;">6</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket  <span style="color: #0000dd;">7</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket  <span style="color: #0000dd;">8</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">36</span>
Bucket  <span style="color: #0000dd;">9</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket <span style="color: #0000dd;">10</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket <span style="color: #0000dd;">11</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket <span style="color: #0000dd;">12</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket <span style="color: #0000dd;">13</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket <span style="color: #0000dd;">14</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">55</span>
Bucket <span style="color: #0000dd;">15</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span>
Bucket <span style="color: #0000dd;">16</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">0</span></pre></div></div>

<p>Wie gut, dass auch die String Variante von HashKey überarbeitet wird.</p>
<p>BTW: Da die internen Strukturen protected sind muss man zu einem kleinen Trick greifen um die Verteilung ausgeben zu können. Ich habe dazu ein template verwendet, dass für alle MFC Maps funktioniert.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> TBase<span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">class</span> TMyMap <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> TBase
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  <span style="color: #0000ff;">void</span> DumpMap<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    TRACE<span style="color: #008000;">&#40;</span>__FUNCTION__ <span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>m_pHashTable<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i<span style="color: #000080;">&lt;</span>m_nHashTableSize<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">int</span> iCount <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>CAssoc <span style="color: #000040;">*</span>p <span style="color: #000080;">=</span> m_pHashTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> p<span style="color: #008080;">;</span> p<span style="color: #000080;">=</span>p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>pNext<span style="color: #008000;">&#41;</span>
          <span style="color: #000040;">++</span>iCount<span style="color: #008080;">;</span>
        TRACE<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Bucket %2d = %4d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, i, iCount<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div>

<p>Merke: Wer Hashes verwendet sollte sich über sein Hashverfahren wirklich gedanken machen.</p>
<p>BTW: Sollte es den Leser meines Blogs langsam langweilen weil ich mich permanent mit Hash-Algorithmen aufhalte, der sei getröstet: Dies war vorläufig mein letzter Beitrag zu CMap&#8230; <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley' /> </p>
<hr /><small>Copyright &copy; 2008 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>
<div class="sociable">

<ul>
	<li class="sociablefirst"><a rel="nofollow"  href="javascript:AddToFavorites();" title="Add to favorites"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/addtofavorites.png" title="Add to favorites" alt="Add to favorites" /></a></li>
	<li><a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F01%2Fcmapstringto-hashkey-implementierung-in-vc-200358-ist-auch-fragwuerdig%2F&amp;title=CMapStringTo...%20HashKey%20Implementierung%20in%20VC-2003%2F5%2F8%20ist%20auch%20fragw%C3%BCrdig&amp;annotation=%C2%A0Hash-Algorithmen%20haben%20es%20mir%20irgendwie%20angetan.%201984%20hatte%20ich%20das%20erste%20mal%20mit%20einem%20miesen%20Hashverfahren%20zu%20tun%2C%20das%20einfach%20versagte%20wenn%20es%20nur%20um%20Ziffern%20ging.%20Das%20ganze%20betraf%20das%20Betriebssystem%20OASIS%20%28sp%C3%A4ter%20TheOS%29%20und%20dessen%20Index%20Dateio" title="Google Bookmarks"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" /></a></li>
	<li><a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F01%2Fcmapstringto-hashkey-implementierung-in-vc-200358-ist-auch-fragwuerdig%2F&amp;title=CMapStringTo...%20HashKey%20Implementierung%20in%20VC-2003%2F5%2F8%20ist%20auch%20fragw%C3%BCrdig&amp;notes=%C2%A0Hash-Algorithmen%20haben%20es%20mir%20irgendwie%20angetan.%201984%20hatte%20ich%20das%20erste%20mal%20mit%20einem%20miesen%20Hashverfahren%20zu%20tun%2C%20das%20einfach%20versagte%20wenn%20es%20nur%20um%20Ziffern%20ging.%20Das%20ganze%20betraf%20das%20Betriebssystem%20OASIS%20%28sp%C3%A4ter%20TheOS%29%20und%20dessen%20Index%20Dateio" title="del.icio.us"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" /></a></li>
	<li><a rel="nofollow"  href="http://www.mister-wong.de/addurl/?bm_url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F01%2Fcmapstringto-hashkey-implementierung-in-vc-200358-ist-auch-fragwuerdig%2F&amp;bm_description=CMapStringTo...%20HashKey%20Implementierung%20in%20VC-2003%2F5%2F8%20ist%20auch%20fragw%C3%BCrdig&amp;plugin=soc" title="MisterWong.DE"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/misterwong.png" title="MisterWong.DE" alt="MisterWong.DE" /></a></li>
	<li><a rel="nofollow"  href="http://technorati.com/faves?add=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F01%2Fcmapstringto-hashkey-implementierung-in-vc-200358-ist-auch-fragwuerdig%2F" title="Technorati"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" /></a></li>
	<li><a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F01%2Fcmapstringto-hashkey-implementierung-in-vc-200358-ist-auch-fragwuerdig%2F&amp;t=CMapStringTo...%20HashKey%20Implementierung%20in%20VC-2003%2F5%2F8%20ist%20auch%20fragw%C3%BCrdig" title="Facebook"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" /></a></li>
	<li><a rel="nofollow"  href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F01%2Fcmapstringto-hashkey-implementierung-in-vc-200358-ist-auch-fragwuerdig%2F&amp;title=CMapStringTo...%20HashKey%20Implementierung%20in%20VC-2003%2F5%2F8%20ist%20auch%20fragw%C3%BCrdig" title="Live"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" /></a></li>
	<li class="sociablelast"><a rel="nofollow"  href="http://twitter.com/home?status=CMapStringTo...%20HashKey%20Implementierung%20in%20VC-2003%2F5%2F8%20ist%20auch%20fragw%C3%BCrdig%20-%20http%3A%2F%2Fblog.m-ri.de%2Findex.php%2F2009%2F08%2F01%2Fcmapstringto-hashkey-implementierung-in-vc-200358-ist-auch-fragwuerdig%2F" title="Twitter"><img src="http://blog.m-ri.de/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" /></a></li>
</ul>
</div>

	<h4>Themenverwandte Beiträge:</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.m-ri.de/index.php/2009/07/29/die-mfc-erhaelt-mit-vc-2010-jetzt-eine-neue-hashkey-implementierung/" title="Die MFC erhält mit VC-2010 jetzt eine neue HashKey Implementierung (Mi 29. Jul 2009)">Die MFC erhält mit VC-2010 jetzt eine neue HashKey Implementierung</a> (1)</li>
	<li><a href="http://blog.m-ri.de/index.php/2009/06/14/die-hashkey-implementierung-in-der-mfc-in-vc-2005-und-vc-2008/" title="Die HashKey Implementierung in der MFC in VC-2005 und VC-2008 (So 14. Jun 2009)">Die HashKey Implementierung in der MFC in VC-2005 und VC-2008</a> (0)</li>
	<li><a href="http://blog.m-ri.de/index.php/2009/12/03/afxmessagebox-versus-cwndmessagebox/" title="AfxMessageBox versus CWnd::MessageBox (Do 03. Dez 2009)">AfxMessageBox versus CWnd::MessageBox</a> (4)</li>
</ul>

]]></description>
		<wfw:commentRss>http://blog.m-ri.de/index.php/2009/08/01/cmapstringto-hashkey-implementierung-in-vc-200358-ist-auch-fragwuerdig/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
