<?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; VS-Tipps&amp;Tricks</title>
	<atom:link href="http://blog.m-ri.de/index.php/category/programmieren/vs-tipps-tricks/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>Sat, 04 Feb 2012 12:07:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>VS-Tipps &amp; Tricks: Debugger Pseudo Variablen</title>
		<link>http://blog.m-ri.de/index.php/2011/11/26/vs-tipps-tricks-debugger-pseudo-variablen/</link>
		<comments>http://blog.m-ri.de/index.php/2011/11/26/vs-tipps-tricks-debugger-pseudo-variablen/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 18:28:55 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Debugging]]></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[VC-2008]]></category>
		<category><![CDATA[VC-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=851</guid>
		<description><![CDATA[Die folgenden Variablen helfen mir immer wieder beim Debuggen und zeigen einem während des Debuggens in Watch-Window manch nützliche Information: $TID Die Thread ID des aktuellen Threads. Nützlich wenn man mehrere Threads debuggt und bestimmte Threads bei einem Breakpoint identifizieren muss. $HANDLES Die Anzahl der aktuell benutzen System-Handles des Prozesses. Handle Leaks lassen sich damit [...]]]></description>
			<content:encoded><![CDATA[<p>Die folgenden Variablen helfen mir immer wieder beim Debuggen und zeigen einem während des Debuggens in Watch-Window manch nützliche Information:</p>
<ul>
<li><strong><em>$TID<br />
</em></strong>Die Thread ID des aktuellen Threads. Nützlich wenn man mehrere Threads debuggt und bestimmte Threads bei einem Breakpoint identifizieren muss.</li>
<li><em><strong>$HANDLES</strong></em><br />
Die Anzahl der aktuell benutzen System-Handles des Prozesses. Handle Leaks lassen sich damit im Debugger leicht überwachen.</li>
<li><em><strong>$ERR<br />
</strong>GetLastError</em> leicht gemacht. Schlägt ein WinApi Befehl fehl, dann ist es schön das man sofort beim Debuggen im Watch-Window sehen kann was die Ursache war. Oft genug ist ja im Code selbst kein Aufruf von <em>GetLastError</em> vorhanden oder nötig.</li>
</ul>
<p>Siehe auch MSDN:<br />
<a href="http://msdn.microsoft.com/en-us/library/ms164891.aspx">http://msdn.microsoft.com/en-us/library/ms164891.aspx</a></p>
<p>BTW: <em>WinDbg</em> hat noch einige mehr nette Pseudovariablen:<br />
<a href="http://blogs.msdn.com/b/debuggingtoolbox/archive/2008/06/16/special-command-using-variables-and-retrieving-information-through-pseudo-registers.aspx">http://blogs.msdn.com/b/debuggingtoolbox/archive/2008/06/16/special-command-using-variables-and-retrieving-information-through-pseudo-registers.aspx</a><br />
Schmerzhaft vermisse ich immer wieder <em>$PEB, $TEB, $TPID, $RA</em> im <em>Visual Studio, </em>komisch, dass es die nur im <em>WinDbg</em> gibt.</p>
<hr /><small>Copyright &copy; 2010 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>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/11/26/vs-tipps-tricks-debugger-pseudo-variablen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VS-Tipps und Tricks:Feststellen ob ATL oder MFC in einem Projekt benutzt werden</title>
		<link>http://blog.m-ri.de/index.php/2011/07/10/vs-tipps-und-tricksfeststellen-ob-atl-oder-mfc-in-einem-projekt-benutzt-werden/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/10/vs-tipps-und-tricksfeststellen-ob-atl-oder-mfc-in-einem-projekt-benutzt-werden/#comments</comments>
		<pubDate>Sun, 10 Jul 2011 15:45:06 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[ATL]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=747</guid>
		<description><![CDATA[Für manche Standardklassen bzw. Header oder Libraries ist es manchmal schön zu wissen ob die ATL oder die MFC in einem Projekt verwendet werden.  In der Vergangenheit habe ich dies oft benutzt um bestimmte Member in Klassen einzubauen, die dann zum Beispiel Daten auch als CString aktzeptieren, oder diese Member dann eben nicht einzubauen um eine Nutzung [...]]]></description>
			<content:encoded><![CDATA[<p>Für manche Standardklassen bzw. Header oder Libraries ist es manchmal schön zu wissen ob die <em>ATL</em> oder die <em>MFC</em> in einem Projekt verwendet werden.  In der Vergangenheit habe ich dies oft benutzt um bestimmte Member in Klassen einzubauen, die dann zum Beispiel Daten auch als <em>CString </em>aktzeptieren, oder diese Member dann eben nicht einzubauen um eine Nutzung in einem &#8220;puren&#8221; <em>WinAPI</em> Projekt zu ermöglichen.<br />
Seit die <em>CString </em>Klassen allerdings eigenständige Templates wurden ist dieser Grund für mich eigentlich weggefallen.<br />
Ich benutzte es heute nur noch um evtl. Memberfunktionen zu unterscheiden die evtl. CWnd* zusätzlich zu HWND Parametern akzeptieren.</p>
<p>Aber wer weiß, vielleicht hat der eine oder andere doch die Frage wie er erkennen kann ob die <em>ATL</em> oder die <em>MFC</em> in einem Projekt Verwendung finden.</p>
<p>Vordefinierte Preprozessor Variablen gibt es dafür nicht, allerdings kann man erkennen ob die Standard <em>ATL</em>/<em>MFC</em>Header in einem Projekt bereits als Include eingefügt wurden, denn in diesem Fall kann man die Existenz der Include-Guards prüfen.</p>
<p>Die <em>MFC</em> benutzt <strong><em>__AFX_H__ </em></strong>als Guard für die <em>afx.h</em>.<br />
Die Basisklassen der <em>ATL</em> befinden sich in der <em>atlbase.h</em>und entsprechend lautet der Guard: <strong><em>__ATLBASE_H__</em></strong>.</p>
<p>Sofern also diese Guards definiert sind wurden auch die entsprechenden Libraries in der <em>stdafx.h</em> oder anderen Headern zuvor included.</p>
<p><strong>Nachtrag 12.07.2011:<br />
Stefan</strong> hat natürlich vollkommen recht mit seinem Kommentar, dass es die zwei Präprozessor-Variablen <strong><em>_MFC_VER </em></strong>und <strong><em>_ATL_VER </em></strong>gibt, die natürlich für den hier erwähnten Einsatz weitaus besser geeigent sind.<br />
Siehe: <a href="http://msdn.microsoft.com/de-de/library/b0084kay.aspx">http://msdn.microsoft.com/de-de/library/b0084kay.aspx</a><br />
Ich habe hier den Wald vor lauter Bäumen nicht gesehen <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Herzlichen Dank für diese produktive Ergänzung.</p>
<hr /><small>Copyright &copy; 2010 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>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/07/10/vs-tipps-und-tricksfeststellen-ob-atl-oder-mfc-in-einem-projekt-benutzt-werden/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>_MSC_VER, _MFC_VER und die bisherigen Werte für die bekannten Compiler</title>
		<link>http://blog.m-ri.de/index.php/2011/05/13/_msc_ver-und-die-bisherigen-werte-fur-die-bekannten-compiler/</link>
		<comments>http://blog.m-ri.de/index.php/2011/05/13/_msc_ver-und-die-bisherigen-werte-fur-die-bekannten-compiler/#comments</comments>
		<pubDate>Fri, 13 May 2011 19:28:08 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Compiler]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=771</guid>
		<description><![CDATA[Die Microsoft C/C++ Compiler haben schon immer eine durchgängige Versionsnummer, die mit den Produkten in denen sie eingebunden sind (z.B. VS-2010) nicht zu tun hat. Diese Produktversion spiegelt auch auch in der vordefinierten Compiler Präprozessor Variable _MSC_VER wieder. Über diese Variable ist es zum Beispiel möglich verschiedene CRT oder STL Library Eigenarten abzufragen und entsprechen [...]]]></description>
			<content:encoded><![CDATA[<p>Die <em>Microsoft</em> C/C++ Compiler haben schon immer eine durchgängige Versionsnummer, die mit den Produkten in denen sie eingebunden sind (z.B. <em>VS-2010</em>) nicht zu tun hat.</p>
<p>Diese Produktversion spiegelt auch auch in der vordefinierten Compiler Präprozessor Variable <em>_MSC_VER </em>wieder. Über diese Variable ist es zum Beispiel möglich verschiedene <em>CRT</em> oder <em>STL</em> Library Eigenarten abzufragen und entsprechen den eigenen Code für mehrere Compiler lauffähig zu machen.  Gleiches gilt natürlich auch für den Code der <em>MFC</em> (siehe Anmerkung am Fuß der Tabelle).</p>
<p>Hier eine kleine Tabelle der Werte, die <em>_MSC_VER </em>für die verschiedenen Compiler annimmt mit ein paar zusätzlichen Hinweisen.</p>
<pre>_MSC_VER  = Compiler
510  = C Compiler 5.1 (DOS)     - 1988?
       Mein aller erster Kontakt mit dem MS-Compiler
600  = C Compiler 6.x (DOS)     - 1990?
700  = C/C++ 7.0                - 1992
       Die UI war damals die PWB. MFC 1.0 wurde veröffentlicht
800  = Visual C++ 1.0           - 1993
       Existierte IMHO als 16bit und 32bit Compiler
900  = Visual C++ 2.0
       Existierte IMHO als 16bit und 32bit Compiler. MFC 3.0
1000 = Visual C++ 4.0           - 1995-03 ?
       Ab dieser Verison nur noch 32bit Compiler. MFC 4.0
???? = Visual C++ 4.1
       War nur für MSDN Subscriber verfügbar. Kam mit erstem Game/DirectX SDK.
???? = Visual C++ 4.2 und 4.21
       Erste Cross-Platform Version für Mac und PC. MFC 4.2, 4.21
1100 = Visual Studio 97 (5.0)   - 1997
       Enthielt weiterhin MFC 4.21
1200 = Visual C++ 6.0           - 1998-06
       Populärtse VC Version. MFC 6.0
1300 = Visual Studio.NET (2002) - 2002-02-13
       .NET hält Einzug. MFC 7.0
1310 = Visual Studio.NET 2003   - 2003-04-24
       MFC 7.1
1400 = Visual Studio 2005       - 2005-11-07
       MFC 8.0
1500 = Visual Studio 2008       - 2007-11-19
       MFC 9.0
1600 = Visual Studio 2010       - 2010-04-10
       MFC 10.0
1700 = Visual C++ 2011          - 2011 ???
       Produktname noch offen evtl. WinC++</pre>
<p>Noch ein Hinweis auf <em>_MFC_VER:<br />
</em>In der Tabelle habe ich nur die Versionen der zum Compiler passenden MFC Versionen aufgeführt. Die <em>MFC</em> setzt einen Define mit dem Namen <em>_MFC_VER </em>entsprechend. Dieser definiert ein <em>WORD</em> im Format <em>0xVVRR</em>. Wobei VV für die Version der <em>MFC</em> steht in hexadezimaler schreibweise und RR für die Revision allerdings in dezimaler Schreibweise. Die aktuelle <em>_MFC_VER </em>von <em>VS-2010 </em>hat also den Wert 0x0A00 und in der MFC 4.21 wurde _MFC_VER als 0&#215;0421 definiert.</p>
<p>PS: Auf die Idee für diese Tabelle kam ich durch eine Diskussion mit einem Teilnehmer auf der <a href="http://cpp.adc2011.de/">ADC für C++ in Prien</a>, der auch schon x-Jahre mit dem MS-Compiler verbracht hat wie ich, und wir über die Entwicklung der Sprache C/C++ nachgedacht haben und was wann als Innovation unsere Programme veränderte. Eben ein typisches Bits+Bytes Gespräch&#8230; <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<hr /><small>Copyright &copy; 2010 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>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/05/13/_msc_ver-und-die-bisherigen-werte-fur-die-bekannten-compiler/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Tipps &amp; Tricks: TFS Administration Tool 2.1</title>
		<link>http://blog.m-ri.de/index.php/2011/01/17/tipps-tricks-tfs-administration-tool-2-1/</link>
		<comments>http://blog.m-ri.de/index.php/2011/01/17/tipps-tricks-tfs-administration-tool-2-1/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 19:37:07 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[Tipps&Tricks]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=732</guid>
		<description><![CDATA[Mit der Benutzerverwaltung im TFS kann man viel unnütze Zeit verbringen. Jeder kennt das Problem der schon mal mehrere Anwender in einem TFS-Projekt verwalten musste. Durch die Dreiteilung der Rechte muss man: Rechte auf dem TFS verwalten (Team Foundation Roles) Rechte auf dem SharePoint Server verwalten (SharePoint Roles) Rechte auf dem SQL Reporting Server verwalten [...]]]></description>
			<content:encoded><![CDATA[<p>Mit der Benutzerverwaltung im TFS kann man viel unnütze Zeit verbringen.<br />
Jeder kennt das Problem der schon mal mehrere Anwender in einem TFS-Projekt verwalten musste. Durch die Dreiteilung der Rechte muss man:</p>
<ul>
<li>Rechte auf dem TFS verwalten (Team Foundation Roles)</li>
<li>Rechte auf dem SharePoint Server verwalten (SharePoint Roles)</li>
<li>Rechte auf dem SQL Reporting Server verwalten (Reporting Services Roles)</li>
</ul>
<p>Wenn also was nicht klappt, weil einem zum Beispiel ein Report nicht angezeigt wird, ist man gleich wieder am grübeln: Wo war das nochmal mit den <em>Reporting Services</em>? Welcher Server, welche Webadresse? Gleiches, wenn man ein Benutzer keinen Zugriff auf die Dokumente in der SharePoint Site hat, die zu einem Projekt angelegt wurde.</p>
<p>Ich fühle mich eigentlich eher als Entwickler, denn als Administrator von einem <em>SharePoint Server</em> oder <em>SQL-Reporting Services</em> Server.</p>
<p>Das Ganze wird um ein vielfaches einfacher durch das <a href="http://tfsadmin.codeplex.com/">TFS Administration Tool 2.1</a>.<br />
Hier kann man auch einfache Art in einem Tool alle Rechte auf einmal einsehen und verwalten. Netterweise wird man in der Listenanzeige sofort durch rote Kästchen auf die Konten aufmerksam gemacht, in denen keine Rechte definiert wurden. In den meisten Fällen ist hier auch schon ein grundsätzliches Problem gefunden.</p>
<p>Das Tool lässt sich auf jedem Client installieren auf dem der <em>Team-Explorer </em>auch installiert wurde.</p>
<p>Link: <a href="http://tfsadmin.codeplex.com/">http://tfsadmin.codeplex.com/</a></p>
<hr /><small>Copyright &copy; 2010 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>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/01/17/tipps-tricks-tfs-administration-tool-2-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VS-Tipps &amp; Tricks: Kommentare intelligent und einfach umbrechen</title>
		<link>http://blog.m-ri.de/index.php/2010/05/20/vs-tipps-tricks-kommentare-intelligent-und-einfach-formatieren/</link>
		<comments>http://blog.m-ri.de/index.php/2010/05/20/vs-tipps-tricks-kommentare-intelligent-und-einfach-formatieren/#comments</comments>
		<pubDate>Thu, 20 May 2010 19:14:00 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=624</guid>
		<description><![CDATA[ Wer programmiert, der dokumentiert auch. Denke ich zumindest Ich zumindest habe teilweise Kommentare, die sich über 10 bis zu 100 Zeilen erstrecken. Die sind nah am Code und erklären, oft was die Hintergründe für das gewählte Design und Vorgehen sind. Leider ist aber der Editor vom Visual Studio kein Word. D.h. absatzweisen Umbruch kennt das [...]]]></description>
			<content:encoded><![CDATA[<p> Wer programmiert, der dokumentiert auch. Denke ich zumindest <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Ich zumindest habe teilweise Kommentare, die sich über 10 bis zu 100 Zeilen erstrecken. Die sind nah am Code und erklären, oft was die Hintergründe für das gewählte Design und Vorgehen sind.</p>
<p>Leider ist aber der Editor vom Visual Studio kein Word. D.h. absatzweisen Umbruch kennt das Ding nicht und manuell solche Texte inkl. Einrückungen und Listen mit Bindestrichen oder 1., 2., 3. zu formatieren ist etwas was gar keinen Spaß macht. Zudem sind die Kommentar Zeichen // oder * eher lästig als hilfreich beim schreiben.<br />
Und auch VAX muss hier mal passen. Aber! Netterweise gibt e auch andere Addins.</p>
<p>Ich habe vor langer Zeit schon den <em>Comment Reflower</em>  entdeckt. Mit dem ist das Ganze ein Klacks.<br />
Aus dem nachfolgenden Text:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Dies ist ein Kommentar, den man nicht wirklich hier schreiben</span>
<span style="color: #666666;">// müsste und der</span>
<span style="color: #666666;">// eigentlich nichts bedeutet außer</span>
<span style="color: #666666;">// die Funktionen von einem netten Addin zu zeigen.</span>
<span style="color: #666666;">// Das</span>
<span style="color: #666666;">//  1. wirklich Arbeit erspart</span>
<span style="color: #666666;">//  2. total simpel zu bedienen ist</span>
<span style="color: #666666;">//  3. für alle VS-Versionen von 2005 über 2008 bis 2010 verfügbar ist.</span>
<span style="color: #666666;">// Was bei der Formatierung heraus kommt lässt sich sehen.</span></pre></div></div>

<p>Wird in Null-Komma-Nichts der folgende Text:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Dies ist ein Kommentar, den man nicht wirklich hier</span>
<span style="color: #666666;">// schreiben müsste und der eigentlich nichts bedeutet</span>
<span style="color: #666666;">// außer die Funktionen von einem netten Addin zu</span>
<span style="color: #666666;">// zeigen. Das</span>
<span style="color: #666666;">//  1. wirklich Arbeit erspart</span>
<span style="color: #666666;">//  2. total simpel zu bedienen ist</span>
<span style="color: #666666;">//  3. für alle VS-Versionen von 2005 über 2008 bis</span>
<span style="color: #666666;">//     2010 verfügbar ist.</span>
<span style="color: #666666;">// Was bei der Formatierung heraus kommt lässt sich</span>
<span style="color: #666666;">// sehen.</span></pre></div></div>

<p>Wer noch mehr Beispiele sehen will, was das Tool leistet findet hier auf der Sourceforge Seite ein <a href="http://commentreflower.sourceforge.net/ExampleFile.cpp" target="_blank">Vorher</a> <a href="http://commentreflower.sourceforge.net/ExampleFileAfter.cpp" target="_blank">Nacher </a>Pärchen.</p>
<p>Das Addin existiert für alles Visual Studio Versionen ab 2005.<br />
Es kann hier heruntergeladen werden:</p>
<ul>
<li>VS-2005: <a href="http://commentreflower.sourceforge.net/" target="_blank">http://commentreflower.sourceforge.net/</a></li>
<li>VS-2008 und VS-2010: <a href="http://www.kynosarges.de/CommentReflower.html" target="_blank">http://www.kynosarges.de/CommentReflower.html</a></li>
</ul>
<p>PS: Es empfiehlt sich ein Blick auf die Blockdefnition in den Einstellungen. Dort ist oft ein Leerzeichen hinter dem * bzw. // eingetragen. Leider lässt sich in meiner Version hier RegEx nicht einschalten. Wer also ein &lt;tab&gt;-Zeichen hinter dem * oder // hat wird sich wundern wenn das Addin keinen Kommentar findet. Ich habe das Leerzeichen einfach entfernt&#8230;</p>
<p>PPS: Für alle nicht C++ Entwickler. Das Tool funktioniert auch für VB und C# <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </p>
<hr /><small>Copyright &copy; 2010 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>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2010/05/20/vs-tipps-tricks-kommentare-intelligent-und-einfach-formatieren/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tipps &amp; Tricks: VS-2010 Hilfe aufbohren</title>
		<link>http://blog.m-ri.de/index.php/2010/04/28/tipps-tricks-vs-2010-hilfe-wenigstens-etwas-aufbohren/</link>
		<comments>http://blog.m-ri.de/index.php/2010/04/28/tipps-tricks-vs-2010-hilfe-wenigstens-etwas-aufbohren/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 23:50:50 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[H3Viewer]]></category>
		<category><![CDATA[HelpViewerKeywordIndex]]></category>
		<category><![CDATA[Hilfe]]></category>
		<category><![CDATA[MSDN]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=619</guid>
		<description><![CDATA[Microsoft ist es wirklich gelungen in zwei großen Schritten die VisualStudio Online Hilfe bzw. MSDN Integration von einem brauchbaren Tool in VC6, über VS-2003/5/8 wo es gerade auszuhalten war, in VS-2010 zu einem Ding zu verwandeln, bei dem mir fast die Worte fehlen. Man schmeiße alle Funktionen des Hilfe-Viewers weg und behalte gerade die F1-Taste&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft ist es wirklich gelungen in zwei großen Schritten die <em>VisualStudio Online Hilfe </em>bzw. <em>MSDN Integration </em>von einem brauchbaren Tool in <em>VC6</em>, über <em>VS-2003/5/8</em> wo es gerade auszuhalten war, in <em>VS-2010 </em>zu einem Ding zu verwandeln, bei dem mir fast die Worte fehlen.<br />
Man schmeiße alle Funktionen des Hilfe-Viewers weg und behalte gerade die <em>F1-Taste</em>&#8230; alle Vorteile, die mir als Vorteile verkauft werden (keine separate Installation, alles im gewohnten Browser etc. siehe Video unten), sehe ich nicht als Vorteile gegenüber den Nachteilen, die in Kauf genommen wurden.<br />
Ein vielleicht hartes Urteil, aber es geht seit Jahren in dieser Beziehung leider nur bergab.<br />
- Just my 2 cents &#8211; <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>Das Erste was ich sofort vermisst habe war in der folgenden Reihenfolge:</p>
<ol>
<li>Dynamic Help</li>
<li>Table of contents (TOC)</li>
<li>Sync to TOC</li>
<li>Index</li>
<li>Filter</li>
<li>Direkte Suche in VS, oder dem entsprechenden Viewer</li>
</ol>
<p>Ich bin dann auf im Internet auf die Suche gegangen und wurde mit 2 Tools fündig, die einem hier helfen können:</p>
<h2>HelpViewerKeywordIndex</h2>
<p>Aber wie angekündigt soll es auch hier Verbesserungen geben. Und das außerhalb der Wartungszyklen des VS (siehe Video unten mit Ryan Linton). Zumindest was den Index betrifft und die Suchmöglichkeit innerhalb von VS betrifft schafft ein kleines Tool von Ryan Linton (wie versprochen seit dem 20.04.) wenigstens etwas Abhilfe, der <a href="http://visualstudiogallery.msdn.microsoft.com/en-us/4af86641-a302-4edf-9853-007bcc670b30">HelpViewerKeywordIndex</a>.</p>
<p>Mit diesem Tool erhält man zumindest mal wieder den Index und ein Suchfenster in VS.<br />
Auch dass das Sucherergebnis in einen VS-Fenster angezeigt werden kann ist nett. Leider betrifft diese Einstellung nicht die Funktion der F1-Taste. In diesem Fall wird immer noch der externe Browser angeworfen und nicht der interne, oder ich habe die Einstellung nicht gefunden wo man mit der <em>F1-Taste</em> ein Browser Fenster in VS öffnet.<br />
Ganz verstanden habe ich auch die Option <em>&#8220;Display TOC in page&#8221;</em> nicht.<br />
Das Tool ist zumindest mal ein kleiner Schimmer eines eventuellen zukünftigen Lichtblicks <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Aber wer weiß, vielleicht lässt Version 1.1 von  <a href="http://visualstudiogallery.msdn.microsoft.com/en-us/4af86641-a302-4edf-9853-007bcc670b30">HelpViewerKeywordIndex</a> nicht lange auf sich warten.</p>
<h2>H3Viewer</h2>
<p>Mit <a href="http://mshcmigrate.helpmvp.com/viewer">H3Viewer</a>, von meinem MVP-Kollegen Rob Chandler, bekommt man zumindest mal wieder das, was man in VS-2008 auch hatte. Table of Contents, Sync to contents. Und der Viewer ist nicht im Browser. Mit dem Ding lässt sich leben oder zumindest ersetzt es den Viewer den wir aus VS-2005/8 kannten ziemlich gut. Und ja, es gibt auch hier wieder Bookmarks, die jetzt keine Favoriten Einträge im Browser sein müssen <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Besonders gefreut habe ich mich auch über die Funktion im Index die Doubletten zum gleichen Stichwort im Index in einem separaten Fenster wieder angezeigt zu bekommen, denn nicht jeder Treffer zu <em>GetWindowtext </em>ist der den ich suche.<br />
Nett auch die TTS Funktion (Text to Speech)<br />
Hier fehlen jetzt eigentlich nur noch die Filter zum vollständigen Glück.</p>
<p>Aber wer weiß, was Microsoft uns demnächst noch zu bieten hat. Laut der Homepage von <em><a href="http://mshcmigrate.helpmvp.com/viewer">H3Viewer </a></em>hat Microsoft noch bereits einige andere Viewer in der Schublade.</p>
<p>Siehe auch:<br />
<a href="http://channel9.msdn.com/posts/kmcgrath/Help-30-New-Help-System-in-Visual-Studio-2010/">http://channel9.msdn.com/posts/kmcgrath/Help-30-New-Help-System-in-Visual-Studio-2010/</a></p>
<p>Links:<br />
<a href="http://visualstudiogallery.msdn.microsoft.com/en-us/4af86641-a302-4edf-9853-007bcc670b30">http://visualstudiogallery.msdn.microsoft.com/en-us/4af86641-a302-4edf-9853-007bcc670b30</a><br />
<a href="http://mshcmigrate.helpmvp.com/viewer">http://mshcmigrate.helpmvp.com/viewer</a></p>
<hr /><small>Copyright &copy; 2010 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>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2010/04/28/tipps-tricks-vs-2010-hilfe-wenigstens-etwas-aufbohren/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>VS-Tipps &amp; Tricks: Springe zur nächsten Klammer funktioniert auch für #if, #elif, #else und #endif</title>
		<link>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/</link>
		<comments>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/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 19:05:08 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></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[SDK]]></category>
		<category><![CDATA[VS-2003]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[VS-2010]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=520</guid>
		<description><![CDATA[Wer sich schon durch die Windows Header gekämpft hat um herauszufinden warum welche Definition einer Struktur oder Funktion in irgend einer Windows Version so oder gar nicht vorhanden ist, der weiß auch wie einem #if, #elif, #else und #endif das Leben schwer machen können, was die Orientierung betrifft. Netterweise hilft einem eine Funktion, die man [...]]]></description>
			<content:encoded><![CDATA[<p>Wer sich schon durch die Windows Header gekämpft hat um herauszufinden warum welche Definition einer Struktur oder Funktion in irgend einer Windows Version so oder gar nicht vorhanden ist, der weiß auch wie einem <em>#if</em>,<em> #elif</em>,<em> #else </em>und <em>#endif </em>das Leben schwer machen können, was die Orientierung betrifft.</p>
<p>Netterweise hilft einem eine Funktion, die man nur von Blöcken und verschachtelten Funktionen her kennt <em><strong>Strg+´</strong></em> (<em>Edit.GotoBrace</em>). Wichtig! Man darf nicht auf der Variable oder Bedingung stehen, sondern muss auf dem Schlüsselwort stehen.</p>
<p>Wenn man auf einer Präprozessor Direktive kann man mit den Tasten die einem zur passenden Klammer bringt zur nachfolgenden Direktive. Und mit dem Festhalten der Umschalttaste kann man den entsprechenden Block auch markieren.</p>
<hr /><small>Copyright &copy; 2010 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>]]></content:encoded>
			<wfw:commentRss>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/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VS-Tipps &amp; Tricks: Format Specifier in den Debugger Fenstern</title>
		<link>http://blog.m-ri.de/index.php/2009/09/23/vs-tipps-tricks-format-specifier-in-den-debugger-fenstern/</link>
		<comments>http://blog.m-ri.de/index.php/2009/09/23/vs-tipps-tricks-format-specifier-in-den-debugger-fenstern/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 19:36:52 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></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[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=474</guid>
		<description><![CDATA[Beim Debuggen Variablen im Watch-Window oder im Quick-View anzeigen zu lassen ist gängige Praxis und jeder etwas fortgeschrittene Entwickler wird diese Funktionen des Visual-Studios nutzen. Üblicherweise wählt der Debugger eine Darstellungsform, die für die Variable geeignet ist. Besonders für STL Datentypen hat sich hier einiges getan seit VC-2005. Dennoch kann man dem Debugger für manche [...]]]></description>
			<content:encoded><![CDATA[<p>Beim Debuggen Variablen im Watch-Window oder im Quick-View anzeigen zu lassen ist gängige Praxis und jeder etwas fortgeschrittene Entwickler wird diese Funktionen des <em>Visual-Studios </em>nutzen.</p>
<p>Üblicherweise wählt der Debugger eine Darstellungsform, die für die Variable geeignet ist. Besonders für <em>STL </em>Datentypen hat sich hier einiges getan seit <em>VC-2005</em>.</p>
<p>Dennoch kann man dem Debugger für manche Datentypen noch einen <em>Format Specifier </em>mitgeben, der einem die Arbeit beim Debuggen extrem erleichert.<br />
<em>Format Specifier </em>erlauben es eine Variable entsprechend Ihrer Verwendung zu interpretieren. Typisch hier wäre eine Windows Nachricht. Als Integer sagt einem <em>0&#215;0129 </em>nicht viel, aber <em>WM_NCCREATE </em>einiges. Wenn man hinter die Variable <em>nMsg </em>im Watch-Fenster einfach aus nMsg,wm erweitert erhält man sofort die Nachricht als symbolischen Wert angezeigt.</p>
<p>Ich will hier nicht alle aber wenigstens ein paar sehr nützliche und weniger bekannte Format Specifier aufzählen:</p>
<p><strong><em>!</em></strong> &#8211; Raw format<br />
<strong><em>hr</em></strong> &#8211; HRESULT in Klartext<br />
<strong><em>su</em></strong> -Unicode<br />
<strong><em>s8</em></strong> &#8211; UTF8<br />
<strong><em>wm</em></strong> &#8211; Windowsnachricht<br />
<strong><em>wc</em></strong> &#8211; Fensterstil<br />
<strong><em>&lt;n&gt;</em></strong> &#8211; Anzahl der Arrayelemente</p>
<p>Am schönsten sieht man die Wirkung an dem folgenden Code und den nachfolgenden Bildern der Watch-Windows:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> g_ai<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000dd;">4711</span>,
  <span style="color: #0000dd;">815</span>,
  <span style="color: #0000dd;">1234</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> _tmain<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, _TCHAR<span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  std<span style="color: #008080;">::</span><span style="color: #007788;">list</span> lst<span style="color: #008080;">;</span>
  lst.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  lst.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  DWORD dwHResult <span style="color: #000080;">=</span> <span style="color: #0000dd;">2147943623</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>szUnicode <span style="color: #000080;">=</span> L<span style="color: #FF0000;">&quot;Unicode ÄÖÜäöü&quot;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>szUTF8Code <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;Umlaute AE=<span style="color: #660099; font-weight: bold;">\xc3</span><span style="color: #660099; font-weight: bold;">\x84</span> OE=<span style="color: #660099; font-weight: bold;">\xc3</span><span style="color: #660099; font-weight: bold;">\x96</span> UE=<span style="color: #660099; font-weight: bold;">\xc3</span><span style="color: #660099; font-weight: bold;">\x9c</span>.&quot;</span><span style="color: #008080;">;</span>
  UINT winmsg <span style="color: #000080;">=</span> <span style="color: #0000dd;">125</span><span style="color: #008080;">;</span>
  DWORD winstyle <span style="color: #000080;">=</span> <span style="color: #208080;">0xA6730000</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>pi <span style="color: #000080;">=</span> g_ai<span style="color: #008080;">;</span>
&nbsp;
  DebugBreak<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Hier das Ganze die Daten im Watchwindow ohne Formatspecifier:</p>
<p><img class="alignnone size-full wp-image-526" title="Watch1" src="http://blog.m-ri.de/wp-content/uploads/2009/09/Watch11.PNG" alt="Watch1" width="591" height="270" /></p>
<p>Hier das Ganze mit:</p>
<p><img class="alignnone size-full wp-image-527" title="Watch2" src="http://blog.m-ri.de/wp-content/uploads/2009/09/Watch21.PNG" alt="Watch2" width="595" height="316" /></p>
<p>Weitere Links dazu:<br />
<a href="http://msdn.microsoft.com/en-us/library/75w45ekt.aspx">http://msdn.microsoft.com/en-us/library/75w45ekt.aspx</a><br />
<a href="http://blogs.msdn.com/vcblog/archive/2006/08/04/689026.aspx">http://blogs.msdn.com/vcblog/archive/2006/08/04/689026.aspx</a></p>
<hr /><small>Copyright &copy; 2010 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>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2009/09/23/vs-tipps-tricks-format-specifier-in-den-debugger-fenstern/feed/</wfw:commentRss>
		<slash:comments>2</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[ASSERTs in der MFC und in der CRT sind tolle Hilfsmittel, aber nicht selten verfälschen sie auch das Problem alleine dadurch, dass ein Fenster aufpoppt, wenn der ASSERT 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 ASSERT Meldung [...]]]></description>
			<content:encoded><![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; 2010 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>]]></content:encoded>
			<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[Wer wollte nicht schon immer mal gerne TRACE (Debug)-Ausgaben in seinem Release Programm haben ohne dafür überall OutputDebugString reinschreiben zu müssen. Die nachfolgene kleine Klasse macht es möglich, den gewohnten Syntax des MFC TRACE Makros zu verwenden und direkt auf die Debugausgabe umzuleiten: //    CTraceToOutputDebugString //        Is a nice replacment class for TRACE //        Easy [...]]]></description>
			<content:encoded><![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; 2010 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>]]></content:encoded>
			<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>
	</channel>
</rss>

