<?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>Steven Engelhardt &#187; Win32</title>
	<atom:link href="http://www.deez.info/sengelha/category/programming/win32/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.deez.info/sengelha</link>
	<description>A financial industry software developer's thoughts and insights</description>
	<lastBuildDate>Tue, 13 Apr 2010 18:28:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pseudoloc</title>
		<link>http://www.deez.info/sengelha/2008/10/31/pseudoloc/</link>
		<comments>http://www.deez.info/sengelha/2008/10/31/pseudoloc/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 14:53:06 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://www.deez.info/sengelha/?p=5504</guid>
		<description><![CDATA[I have released a pseudolocalization tool I wrote for 32-bit Windows resource DLLs here.
]]></description>
			<content:encoded><![CDATA[<p>I have released a pseudolocalization tool I wrote for 32-bit Windows resource DLLs <a href="http://www.deez.info/sengelha/code/pseudoloc/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.deez.info/sengelha/2008/10/31/pseudoloc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Balloon Tooltips</title>
		<link>http://www.deez.info/sengelha/2008/06/12/balloon-tooltips/</link>
		<comments>http://www.deez.info/sengelha/2008/06/12/balloon-tooltips/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 15:17:17 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://www.deez.info/sengelha/?p=5477</guid>
		<description><![CDATA[In the Windows XP login screen, the password text box will warn you with a balloon tooltip if you accidentally turn Caps Lock on:

The balloon tooltip appears to be a Windows tooltip common control with the TTS_BALLOON style.
To replicate this functionality, I decided to write a function called ShowMsgBalloon() which, given a control and the [...]]]></description>
			<content:encoded><![CDATA[<p>In the Windows XP login screen, the password text box will warn you with a balloon tooltip if you accidentally turn Caps Lock on:</p>
<p><a href="http://www.deez.info/sengelha/wp-content/uploads/2008/06/winxp-caps-lock-msg.png"><img class="alignnone size-medium wp-image-5481" title="winxp-caps-lock-msg" height="154" alt="Windows XP Caps Lock Warning Message" src="http://www.deez.info/sengelha/wp-content/uploads/2008/06/winxp-caps-lock-msg-300x154.png" width="300" /></a></p>
<p>The balloon tooltip appears to be a <a href="http://msdn.microsoft.com/en-us/library/bb760250(VS.85).aspx">Windows tooltip common control</a> with the <a href="http://msdn.microsoft.com/en-us/library/bb760248(VS.85).aspx">TTS_BALLOON style</a>.</p>
<p>To replicate this functionality, I decided to write a function called <code>ShowMsgBalloon()</code> which, given a control and the various balloon tooltip parameters, creates and shows the balloon tooltip below the control.</p>
<p>The key insight to making <code>ShowMsgBallon()</code> work as intended was to use the <a href="http://msdn.microsoft.com/en-us/library/bb760252(VS.85).aspx"><code>TTF_TRACK</code></a> option to create a tracking tooltip. This will immediately show the tooltip without requiring the user to position the mouse over the control. The main downside to using <code>TTF_TRACK</code> is that the tooltip will not move with the control if the window is moved; you need to manually move the tooltip using <code>TTM_TRACKPOSITION</code> as required. One could probably make this automatic by subclassing the tooltip&#8217;s parent control and handling <a href="http://msdn.microsoft.com/en-us/library/ms632652(VS.85).aspx"><code>WM_WINDOWPOSCHANGED</code></a> messages.</p>
<p>Here is the source code to <code>ShowMsgBalloon()</code>. When you are done with the balloon, call <a href="http://msdn.microsoft.com/en-us/library/ms632682.aspx"><code>DestroyWindow()</code></a> on the returned <code>HWND</code>. Note: you may want your application to <a href="http://msdn.microsoft.com/en-us/library/ms997646.aspx">use comctl32.dll version 6</a> as it will lead to a nicer visual style, including a close button.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;windows.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;commctrl.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Options to ShowMsgBallon() (see dwOpts parameter). &nbsp;These are the</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// standard icon types for balloon tooltips.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define SMB_ICON_INFO &nbsp; &nbsp;(1 &lt;&lt; 0)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define SMB_ICON_WARNING (1 &lt;&lt; 1)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define SMB_ICON_ERROR &nbsp; (1 &lt;&lt; 2)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Given the options passed to ShowMsgBalloon(), determine what</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// parameter to send to TTM_SETTITLE for the balloon tooltip&#8217;s icon.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">static</span> DWORD</div>
</li>
<li class="li1">
<div class="de1">GetTitleIcon<span class="br0">&#40;</span>DWORD dwOpts<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>dwOpts &amp;amp; SMB_ICON_INFO<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> TTI_INFO;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>dwOpts &amp;amp; SMB_ICON_WARNING<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> TTI_WARNING;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>dwOpts &amp;amp; SMB_ICON_ERROR<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> TTI_ERROR;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Create and show a balloon tooltip immediately below the control</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// hwndCtrl with the given title, message, and options.</span></div>
</li>
<li class="li1">
<div class="de1">HWND</div>
</li>
<li class="li1">
<div class="de1">ShowMsgBalloon<span class="br0">&#40;</span>HWND hwndCtrl, LPCTSTR szTitle, LPCTSTR szMsg,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD dwOpts<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; HWND hwndRet = <span class="kw2">NULL</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; HWND hwndTT = <span class="kw2">NULL</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; TOOLINFO ti = <span class="br0">&#123;</span> <span class="nu0">0</span> <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RECT rc;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Even though TTS_CLOSE is always specified, a close button will</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// only be shown if your application has a manifest that requires</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// comctl32.dll version 6.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; hwndTT = CreateWindow</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; TOOLTIPS_CLASS,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; TEXT<span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; WS_POPUP | TTS_NOPREFIX | TTS_BALLOON | TTS_CLOSE,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT, CW_USEDEFAULT,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT, CW_USEDEFAULT,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; hwndCtrl,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">NULL</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hwndTT == <span class="kw2">NULL</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">goto</span> Cleanup;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// By using TTTOOLINFO_V1_SIZE rather than sizeof(TOOLINFO),</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">// we don&#8217;t require users to be using comctl32 version 6.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ti.<span class="me1">cbSize</span> = TTTOOLINFO_V1_SIZE;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ti.<span class="me1">uFlags</span> = TTF_TRACK;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ti.<span class="me1">hwnd</span> = hwndCtrl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ti.<span class="me1">lpszText</span> = const_cast&lt;lptstr&gt;<span class="br0">&#40;</span>szMsg<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!SendMessage<span class="br0">&#40;</span>hwndTT, TTM_ADDTOOL, <span class="nu0">0</span>, <span class="br0">&#40;</span>LPARAM<span class="br0">&#41;</span> &amp;amp;ti<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">goto</span> Cleanup;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!SendMessage<span class="br0">&#40;</span>hwndTT, TTM_SETTITLE, GetTitleIcon<span class="br0">&#40;</span>dwOpts<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>LPARAM<span class="br0">&#41;</span> szTitle<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">goto</span> Cleanup;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Position the tooltip below the control</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!GetWindowRect<span class="br0">&#40;</span>hwndCtrl, &amp;amp;rc<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">goto</span> Cleanup;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SendMessage<span class="br0">&#40;</span>hwndTT, TTM_TRACKPOSITION, <span class="nu0">0</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MAKELONG<span class="br0">&#40;</span>rc.<span class="me1">left</span> + <span class="nu0">10</span>, rc.<span class="me1">bottom</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Show the tooltip</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!SendMessage<span class="br0">&#40;</span>hwndTT, TTM_TRACKACTIVATE, <span class="kw2">TRUE</span>, <span class="br0">&#40;</span>LPARAM<span class="br0">&#41;</span> &amp;amp;ti<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">goto</span> Cleanup;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; hwndRet = hwndTT;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; hwndTT = <span class="kw2">NULL</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Cleanup:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hwndTT != <span class="kw2">NULL</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ::<span class="me2">DestroyWindow</span><span class="br0">&#40;</span>hwndTT<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> hwndRet;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p><strong>Update</strong> 2008-11-01 3:08PM: If you are targeting <a href="http://msdn.microsoft.com/en-us/library/ms997646.aspx">comctl32.dll version 6</a> or later, I recommend using the <a href="http://msdn.microsoft.com/en-us/library/bb761668(VS.85).aspx">EM_SHOWBALLOONTIP message</a>.&#160; Comctl32.dll version 6 or later also automatically shows the caps lock warning balloon for edit boxes with the <a href="http://msdn.microsoft.com/en-us/library/6e36b89f(VS.80).aspx">ES_PASSWORD window style</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.deez.info/sengelha/2008/06/12/balloon-tooltips/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>STL objects and module boundaries</title>
		<link>http://www.deez.info/sengelha/2008/01/04/stl-objects-and-module-boundaries/</link>
		<comments>http://www.deez.info/sengelha/2008/01/04/stl-objects-and-module-boundaries/#comments</comments>
		<pubDate>Fri, 04 Jan 2008 22:27:15 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[STL]]></category>
		<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://www.deez.info/sengelha/blog/2008/01/04/stl-objects-and-module-boundaries/</guid>
		<description><![CDATA[Let&#8217;s say you have the following function:



void AppendChar&#40;std::string&#38; s, char ch&#41;


&#123;


&#160; &#160; s += ch;


&#125;



What happens if this function is exported as an ordinal function from a DLL (not an inlined piece of code inside a header) and you call it from an EXE?

It works most of the time.  When it doesn&#8217;t, it corrupts [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s say you have the following function:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">void</span> AppendChar<span class="br0">&#40;</span>std::<span class="me2">string</span>&amp; s, <span class="kw4">char</span> ch<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; s += ch;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>What happens if this function is exported as an ordinal function from a DLL (not an inlined piece of code inside a header) and you call it from an EXE?<br />
<span id="more-5438"></span><br />
It works most of the time.  When it doesn&#8217;t, it corrupts your heap and causes a spectacular mess.</p>
<p>In Windows you must <a href="http://blogs.msdn.com/oldnewthing/archive/2006/09/15/755966.aspx">free memory with the same allocator that allocated it</a>. However, your EXE may not share the same allocator as the DLL.  Perhaps the two modules are linked against different versions of libc, or perhaps one of the modules is using a static version of libc.  If your EXE and DLL do <em>not </em>share an allocator <em>and</em> if AppendChar resizes the string s, you will almost certainly cause a heap corruption.</p>
<p>The STL performs a lot of reallocations behind the scenes for you; this is one of its major benefits.  Unfortunately, if you are writing a general-purpose DLL these behind-the-scene allocations are deadly.  You cannot know or dictate what version of libc your clients will use.</p>
<p>Therefore, I reiterate my <a href="http://www.deez.info/sengelha/2006/03/03/c-stl-dlls-and-buggy-optimizations/">previous recommendation</a>:</p>
<blockquote><p>Avoid passing STL objects as parameters to DLLs.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.deez.info/sengelha/2008/01/04/stl-objects-and-module-boundaries/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Runtime Memory Allocation Tracing</title>
		<link>http://www.deez.info/sengelha/2007/11/10/runtime-memory-allocation-tracing/</link>
		<comments>http://www.deez.info/sengelha/2007/11/10/runtime-memory-allocation-tracing/#comments</comments>
		<pubDate>Sat, 10 Nov 2007 06:34:18 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://www.deez.info/sengelha/blog/2007/11/10/runtime-memory-allocation-tracing/</guid>
		<description><![CDATA[
While reading the paper Dynamic Storage Allocation: A Survey and Critical Review, I quickly focused on the claim that one requires actual memory allocation traces, as opposed to simulated data, in order to properly design an optimized memory allocator.  After my experience with Win32 LD_PRELOAD, I knew that I could implement a minimally invasive [...]]]></description>
			<content:encoded><![CDATA[<p>
While reading the paper <a href="http://citeseer.ist.psu.edu/wilson95dynamic.html">Dynamic Storage Allocation: A Survey and Critical Review</a>, I quickly focused on the claim that one requires <i>actual</i> memory allocation traces, as opposed to simulated data, in order to properly design an optimized memory allocator.  After my experience with <a href="http://www.deez.info/sengelha/code/win32-ldpreload/">Win32 LD_PRELOAD</a>, I knew that I could implement a minimally invasive memory trace mechanism for existing Windows binaries.  So I did.
</p>
<p>
My first task was to write a program which would launch the application we wanted to trace and log its calls to the Windows memory allocation functions.  As I recommend on my Win32 LD_PRELOAD page, I used Microsoft Research&#8217;s <a href="http://research.microsoft.com/sn/detours/">Detours</a>, rather than Win32 LD_PRELOAD, for the mechanism to intercept Windows function calls.  The only functions I chose to intercept were <a href="http://msdn2.microsoft.com/en-us/library/aa366597.aspx">HeapAlloc</a> and <a href="http://msdn2.microsoft.com/en-us/library/aa366701.aspx">HeapFree</a>; these functions seem to be the workhorses of the Windows memory allocation world.
</p>
<p>
When my code detects a call to HeapAlloc or HeapFree, it logs basic information about the call to a file and then forwards the call to their real implementations.  Reentrancy was an issue; the process of logging could potentially cause another allocation, so I had to guard against that.  A more robust application would also consider multithreading scenarios more carefully.
</p>
<p>
For performance and space considerations, I decided the allocation logger would write log entries as binary records into a file.  An allocation log record is 17 bytes long; a free, 13 bytes.  However, memory operations are so frequent that a one minute browsing session in Firefox (including a quick visit to <a href="http://google.com/reader/">Google Reader</a>), generated a 14 megabyte log file.  Furthermore, the logger introduced a noticeable, although not drastic, performance hit.
</p>
<p>
With the Firefox log file in hand, I wrote a few post-processing scripts in <a href="http://python.org/">Python</a> to calculate some useful data, including total cumulative memory usage and a memory allocation frequency histogram.  I then used <a href="http://gnuplot.info/">Gnuplot</a> to graph the results.
</p>
<p>
Here is the total cumulative memory usage graph for my short Firefox browsing session:
</p>
<p><a href='http://www.deez.info/sengelha/wp-content/uploads/2007/11/memuse.png' title='Firefox Total Cumulative Memory Use'><img src='http://www.deez.info/sengelha/wp-content/uploads/2007/11/memuse.thumbnail.png' alt='Firefox Total Cumulative Memory Use' /></a></p>
<p>
Here is the memory allocation frequency histogram.  Note the log-log scale; Firefox (like most applications) is so dominated by very small allocations that the graph is useless without it.  The graph has a <i>huge</i> spike of allocations with very small object sizes and, somewhat interestingly, a moderate one with sizes just under 10 KB.
</p>
<p><a href='http://www.deez.info/sengelha/wp-content/uploads/2007/11/allocsizes.png' title='Firefox Memory Allocation Frequency'><img src='http://www.deez.info/sengelha/wp-content/uploads/2007/11/allocsizes.thumbnail.png' alt='Firefox Memory Allocation Frequency' /></a></p>
<p>
Here is the <a href='http://www.deez.info/sengelha/wp-content/uploads/2007/11/memtrace.zip' title='Memory Trace Logger Source Code'>source code to the memory trace logger</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.deez.info/sengelha/2007/11/10/runtime-memory-allocation-tracing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Custom-Drawn Tooltips</title>
		<link>http://www.deez.info/sengelha/2007/08/28/custom-drawn-tooltips/</link>
		<comments>http://www.deez.info/sengelha/2007/08/28/custom-drawn-tooltips/#comments</comments>
		<pubDate>Tue, 28 Aug 2007 04:55:45 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://www.deez.info/sengelha/blog/2007/08/28/owner-drawn-tooltips/</guid>
		<description><![CDATA[
Like many common controls, the tooltip control supports custom drawing for maximum flexibility.  This is a quick tutorial on how to use the tooltip custom draw facility.



First, start with the following scratch program (which is a slightly modified version of Raymond Chen&#8217;s scratch program):




#define STRICT


#include &#60;windows.h&#62;


#include &#60;windowsx.h&#62;


#include &#60;commctrl.h&#62;


#include &#60;tchar.h&#62;


&#160;


#define WND_CLASS_NAME TEXT(&#34;Scratch&#34;)


&#160;


HINSTANCE g_hinst;


&#160;


BOOL OnCreate&#40;HWND hwnd, [...]]]></description>
			<content:encoded><![CDATA[<p>
Like many common controls, the <a href="http://msdn2.microsoft.com/en-us/library/ms650453.aspx">tooltip control</a> supports custom drawing for maximum flexibility.  This is a quick tutorial on how to use the tooltip custom draw facility.
</p>
<p><span id="more-5422"></span></p>
<p>
First, start with the following scratch program (which is a slightly modified version of <a href="http://blogs.msdn.com/oldnewthing/archive/2003/07/23/54576.aspx">Raymond Chen&#8217;s scratch program</a>):
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#define STRICT</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;windows.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;windowsx.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;commctrl.h&gt;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">#include &lt;tchar.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define WND_CLASS_NAME TEXT(&quot;Scratch&quot;)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">HINSTANCE g_hinst;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">BOOL</span> OnCreate<span class="br0">&#40;</span>HWND hwnd, LPCREATESTRUCT lpcs<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">TRUE</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> OnDestroy<span class="br0">&#40;</span>HWND hwnd<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; PostQuitMessage<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">LRESULT CALLBACK WndProc<span class="br0">&#40;</span>HWND hwnd, UINT uiMsg, WPARAM wParam,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LPARAM lParam<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>uiMsg<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; HANDLE_MSG<span class="br0">&#40;</span>hwnd, WM_CREATE, OnCreate<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; HANDLE_MSG<span class="br0">&#40;</span>hwnd, WM_DESTROY, OnDestroy<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> DefWindowProc<span class="br0">&#40;</span>hwnd, uiMsg, wParam, lParam<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">BOOL</span> RegisterWindowClass<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; WNDCLASS wc;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ATOM atom;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; wc.<span class="me1">style</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; wc.<span class="me1">lpfnWndProc</span> = WndProc;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; wc.<span class="me1">cbClsExtra</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; wc.<span class="me1">cbWndExtra</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; wc.<span class="me1">hInstance</span> = g_hinst;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; wc.<span class="me1">hIcon</span> = <span class="kw2">NULL</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; wc.<span class="me1">hCursor</span> = LoadCursor<span class="br0">&#40;</span><span class="kw2">NULL</span>, IDC_ARROW<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; wc.<span class="me1">hbrBackground</span> = <span class="br0">&#40;</span>HBRUSH<span class="br0">&#41;</span><span class="br0">&#40;</span>COLOR_WINDOW + <span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; wc.<span class="me1">lpszMenuName</span> = <span class="kw2">NULL</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; wc.<span class="me1">lpszClassName</span> = WND_CLASS_NAME;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; atom = RegisterClass<span class="br0">&#40;</span>&amp;wc<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>atom != <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> WINAPI _tWinMain<span class="br0">&#40;</span>HINSTANCE hinst, HINSTANCE hinstPrev,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LPTSTR lpCmdLine, <span class="kw4">int</span> nCmdShow<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; INITCOMMONCONTROLSEX icc;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> ret = <span class="kw2">EXIT_FAILURE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; g_hinst = hinst;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// We will need the tooltip common control</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; icc.<span class="me1">dwSize</span> = <span class="kw3">sizeof</span><span class="br0">&#40;</span>icc<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; icc.<span class="me1">dwICC</span> = ICC_WIN95_CLASSES;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>InitCommonControlsEx<span class="br0">&#40;</span>&amp;icc<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>RegisterWindowClass<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HWND hwnd = CreateWindow</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WND_CLASS_NAME,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TEXT<span class="br0">&#40;</span><span class="st0">&quot;Scratch&quot;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WS_OVERLAPPEDWINDOW,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT, CW_USEDEFAULT,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT, CW_USEDEFAULT,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hinst,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hwnd != <span class="kw2">NULL</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MSG msg;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> ShowWindow<span class="br0">&#40;</span>hwnd, nCmdShow<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>GetMessage<span class="br0">&#40;</span>&amp;msg, <span class="kw2">NULL</span>, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TranslateMessage<span class="br0">&#40;</span>&amp;msg<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DispatchMessage<span class="br0">&#40;</span>&amp;msg<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret = <span class="kw2">EXIT_SUCCESS</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> ret;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>
Next, we&#8217;ll add a tooltip to this window.  We&#8217;re not going to do anything fancy like <a href="http://blogs.msdn.com/oldnewthing/archive/2006/06/28/649680.aspx">tooltip multiplexing</a> so we&#8217;ll use <a href="http://msdn2.microsoft.com/en-us/library/ms650460.aspx">TTF_SUBCLASS</a>.
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">HWND g_hwndTT;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">BOOL</span> OnCreate<span class="br0">&#40;</span>HWND hwnd, LPCREATESTRUCT lpcs<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">BOOL</span> ret = <span class="kw2">FALSE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Create the tooltip window</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; g_hwndTT = CreateWindow</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; TOOLTIPS_CLASS,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; TTS_NOPREFIX,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT, CW_USEDEFAULT,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT, CW_USEDEFAULT,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; hwnd,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; g_hinst,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">NULL</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>g_hwndTT != <span class="kw2">NULL</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Tell the tooltip to register itself using the entire scratch</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// window&#8217;s client area as the active region.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; TOOLINFO ti = <span class="br0">&#123;</span> <span class="kw3">sizeof</span><span class="br0">&#40;</span>ti<span class="br0">&#41;</span> <span class="br0">&#125;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; ti.<span class="me1">uFlags</span> = TTF_SUBCLASS;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ti.<span class="me1">hwnd</span> = hwnd;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ti.<span class="me1">hinst</span> = g_hinst;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ti.<span class="me1">uId</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ti.<span class="me1">lpszText</span> = TEXT<span class="br0">&#40;</span><span class="st0">&quot;Hello world!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>GetClientRect<span class="br0">&#40;</span>hwnd, &amp;ti.<span class="me1">rect</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>SendMessage<span class="br0">&#40;</span>g_hwndTT, TTM_ADDTOOL, <span class="nu0">0</span>, <span class="br0">&#40;</span>LPARAM<span class="br0">&#41;</span>&amp;ti<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret = <span class="kw2">TRUE</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// If there were any failures, clean up the allocated objects</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!ret<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>g_hwndTT<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DestroyWindow<span class="br0">&#40;</span>g_hwndTT<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> ret;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>
If you compile and run the program, you should see a tooltip with the text &#8220;Hello World!&#8221; pop up.
</p>
<p>
To use custom draw, we must handle the <a href="http://msdn2.microsoft.com/en-us/library/ms672574.aspx"><code>NM_CUSTOMDRAW</code> message</a>.  First we&#8217;ll write the <code>WM_NOTIFY</code> handler to forward the message to our function.
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">LRESULT OnToolTipCustomDraw<span class="br0">&#40;</span>NMTTCUSTOMDRAW* pcd<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Perform the default action (i.e. have the tooltip control draw</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// &quot;Hello World!&quot; itself)</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> CDRF_DODEFAULT;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">LRESULT OnNotify<span class="br0">&#40;</span>HWND hwnd, <span class="kw4">int</span> idFrom, NMHDR* pnm<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>pnm-&gt;hwndFrom == g_hwndTT<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>pnm-&gt;code<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> NM_CUSTOMDRAW:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> OnToolTipCustomDraw<span class="br0">&#40;</span><span class="br0">&#40;</span>NMTTCUSTOMDRAW*<span class="br0">&#41;</span> pnm<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">LRESULT CALLBACK WndProc<span class="br0">&#40;</span>HWND hwnd, UINT uiMsg, WPARAM wParam,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LPARAM lParam<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>uiMsg<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; HANDLE_MSG<span class="br0">&#40;</span>hwnd, WM_CREATE, OnCreate<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; HANDLE_MSG<span class="br0">&#40;</span>hwnd, WM_DESTROY, OnDestroy<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; HANDLE_MSG<span class="br0">&#40;</span>hwnd, WM_NOTIFY, OnNotify<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> DefWindowProc<span class="br0">&#40;</span>hwnd, uiMsg, wParam, lParam<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>
Now we&#8217;ll implement the custom draw function.  For simplicity&#8217;s sake, we will simply write the text &#8220;Hello World!&#8221; just as the tooltip did before we used custom draw.
</p>
<p>
It is important to note that the tooltip control will continue to draw the static text even if we are using custom draw.  To get around this problem, we&#8217;ll have the tooltip control draw the text in the same color as the background, effectively making it invisible.
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Draw the contents of the tooltip within the rectangle prc</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> DrawToolTipContent<span class="br0">&#40;</span>HDC hdc, RECT* prc<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SetTextColor<span class="br0">&#40;</span>hdc, RGB<span class="br0">&#40;</span><span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; TextOut<span class="br0">&#40;</span>hdc, prc-&gt;left, prc-&gt;top, TEXT<span class="br0">&#40;</span><span class="st0">&quot;Hello World!&quot;</span><span class="br0">&#41;</span>, <span class="nu0">12</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">LRESULT OnToolTipCustomDraw<span class="br0">&#40;</span>NMTTCUSTOMDRAW* pcd<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>pcd-&gt;nmcd.<span class="me1">dwDrawStage</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> CDDS_PREPAINT:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Set the text and back colors of default text so it</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// becomes invisible</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; COLORREF clrBg = <span class="br0">&#40;</span>COLORREF<span class="br0">&#41;</span> SendMessage<span class="br0">&#40;</span>g_hwndTT,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TTM_GETTIPBKCOLOR,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SetTextColor<span class="br0">&#40;</span>pcd-&gt;nmcd.<span class="me1">hdc</span>, clrBg<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SetBkColor<span class="br0">&#40;</span>pcd-&gt;nmcd.<span class="me1">hdc</span>, clrBg<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> CDRF_NOTIFYPOSTPAINT;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> CDDS_POSTPAINT:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DrawToolTipContent<span class="br0">&#40;</span>pcd-&gt;nmcd.<span class="me1">hdc</span>, &amp;pcd-&gt;nmcd.<span class="me1">rc</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> CDRF_SKIPDEFAULT;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> CDRF_DODEFAULT;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>
We now can use the full range of GDI functions to render the content of the tooltip, including multiple fonts, lines, ellipses, etc.  However, drawing is limited to the size of the tooltip&#8217;s client window, and this is determined based on the text passed to the tooltip window in <code>OnCreate()</code>.  If we want to control the size of the tooltip, we must handle the <a href="http://msdn2.microsoft.com/en-us/library/ms650482.aspx"><code>TTN_SHOW</code> message</a>:
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">LPCTSTR g_szTooltipMsg = TEXT<span class="br0">&#40;</span><span class="st0">&quot;Hello World!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Determine the required size of the client area of the tooltip</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">BOOL</span> GetToolTipContentSize<span class="br0">&#40;</span>SIZE* psz<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">BOOL</span> ret = <span class="kw2">FALSE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; HDC hdc = GetDC<span class="br0">&#40;</span>g_hwndTT<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hdc != <span class="kw2">NULL</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; HFONT hfontTT = <span class="br0">&#40;</span>HFONT<span class="br0">&#41;</span> SendMessage<span class="br0">&#40;</span>g_hwndTT, WM_GETFONT, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; HFONT hfontTTOld = <span class="br0">&#40;</span>HFONT<span class="br0">&#41;</span> SelectObject<span class="br0">&#40;</span>hdc, hfontTT<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hfontTTOld != <span class="kw2">NULL</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SIZE szText;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>GetTextExtentPoint32<span class="br0">&#40;</span>hdc, g_szTooltipMsg,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lstrlen<span class="br0">&#40;</span>g_szTooltipMsg<span class="br0">&#41;</span>, &amp;szText<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; psz-&gt;cx = szText.<span class="me1">cx</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; psz-&gt;cy = szText.<span class="me1">cy</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret = <span class="kw2">TRUE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SelectObject<span class="br0">&#40;</span>hdc, hfontTTOld<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ReleaseDC<span class="br0">&#40;</span>g_hwndTT, hdc<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> ret;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Determine the required client rectangle of the tooltip to fit the</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// text</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">BOOL</span> GetToolTipContentRect<span class="br0">&#40;</span>RECT* prc<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">BOOL</span> ret = <span class="kw2">FALSE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SIZE sz;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>GetToolTipContentSize<span class="br0">&#40;</span>&amp;sz<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>GetWindowRect<span class="br0">&#40;</span>g_hwndTT, prc<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prc-&gt;right = prc-&gt;left + sz.<span class="me1">cx</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prc-&gt;bottom = prc-&gt;top + sz.<span class="me1">cy</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret = <span class="kw2">TRUE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> ret;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// When the tooltip is being shown, size it to fit the content</span></div>
</li>
<li class="li1">
<div class="de1">LRESULT OnToolTipShow<span class="br0">&#40;</span>NMHDR* pnm<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; LRESULT ret = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RECT rc;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>GetToolTipContentRect<span class="br0">&#40;</span>&amp;rc<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Adjust the rectangle to be the proper size to contain the</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// content</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>SendMessage<span class="br0">&#40;</span>g_hwndTT, TTM_ADJUSTRECT, <span class="kw2">TRUE</span>, <span class="br0">&#40;</span>LPARAM<span class="br0">&#41;</span> &amp;rc<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Resize and move the tooltip accordingly</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>SetWindowPos<span class="br0">&#40;</span>g_hwndTT, <span class="kw2">NULL</span>, rc.<span class="me1">left</span>, rc.<span class="me1">top</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rc.<span class="me1">right</span> &#8211; rc.<span class="me1">left</span>, rc.<span class="me1">bottom</span> &#8211; rc.<span class="me1">top</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SWP_NOZORDER | SWP_NOACTIVATE<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret = <span class="kw2">TRUE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> ret;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">LRESULT OnNotify<span class="br0">&#40;</span>HWND hwnd, <span class="kw4">int</span> idFrom, NMHDR* pnm<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>pnm-&gt;hwndFrom == g_hwndTT<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>pnm-&gt;code<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> TTN_SHOW:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> OnToolTipShow<span class="br0">&#40;</span>pnm<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> NM_CUSTOMDRAW:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> OnToolTipCustomDraw<span class="br0">&#40;</span><span class="br0">&#40;</span>NMTTCUSTOMDRAW*<span class="br0">&#41;</span> pnm<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> DrawToolTipContent<span class="br0">&#40;</span>HDC hdc, RECT* prc<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SetTextColor<span class="br0">&#40;</span>hdc, RGB<span class="br0">&#40;</span><span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; TextOut<span class="br0">&#40;</span>hdc, prc-&gt;left, prc-&gt;top, g_szTooltipMsg,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lstrlen<span class="br0">&#40;</span>g_szTooltipMsg<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>
We now have a sizable, custom-drawable tooltip control.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.deez.info/sengelha/2007/08/28/custom-drawn-tooltips/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Win32: Getting LOGFONT from HFONT</title>
		<link>http://www.deez.info/sengelha/2007/08/22/win32-getting-logfont-from-hfont/</link>
		<comments>http://www.deez.info/sengelha/2007/08/22/win32-getting-logfont-from-hfont/#comments</comments>
		<pubDate>Wed, 22 Aug 2007 17:43:48 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://www.deez.info/sengelha/blog/2007/08/22/win32-getting-logfont-from-hfont/</guid>
		<description><![CDATA[
To convert a HFONT to a LOGFONT, use the GDI function GetObject(), as in:




LOGFONT lf;


int ret = GetObject&#40;hfont, sizeof&#40;lf&#41;, &#38;lf&#41;;


// Be sure to check the return value of GetObject




The code is trivial but the function took me forever to find.
]]></description>
			<content:encoded><![CDATA[<p>
To convert a <code>HFONT</code> to a <a href="http://msdn2.microsoft.com/en-us/library/ms533931.aspx"><code>LOGFONT</code></a>, use the GDI function <a href="http://msdn2.microsoft.com/en-us/library/aa932477.aspx"><code>GetObject()</code></a>, as in:
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">LOGFONT lf;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> ret = GetObject<span class="br0">&#40;</span>hfont, <span class="kw3">sizeof</span><span class="br0">&#40;</span>lf<span class="br0">&#41;</span>, &amp;lf<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Be sure to check the return value of GetObject</span></div>
</li>
</ol>
</div>
<p>
The code is trivial but the function took me forever to find.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.deez.info/sengelha/2007/08/22/win32-getting-logfont-from-hfont/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Microsoft&#8217;s XmlLite</title>
		<link>http://www.deez.info/sengelha/2007/07/12/microsofts-xmllite/</link>
		<comments>http://www.deez.info/sengelha/2007/07/12/microsofts-xmllite/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 03:53:01 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Win32]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.deez.info/sengelha/blog/2007/07/12/microsofts-xmllite/</guid>
		<description><![CDATA[
Microsoft has created a new, lightweight C++ XML processing library called XmlLite.  It includes a streaming XML writing class patterned after .NET&#8217;s System.Xml.XmlWriter.


This library makes the IXmlWriter in Implementing IXmlWriter Series obsolete for Windows developers.
]]></description>
			<content:encoded><![CDATA[<p>
Microsoft has created a new, lightweight C++ XML processing library called <a href="https://msdn2.microsoft.com/en-us/library/ms752838.aspx">XmlLite</a>.  It includes a streaming XML writing class patterned after .NET&#8217;s <a href="http://msdn2.microsoft.com/en-us/library/system.xml.xmlwriter.aspx">System.Xml.XmlWriter</a>.
</p>
<p>
This library makes the <code>IXmlWriter</code> in <a href="http://www.deez.info/sengelha/implementing-ixmlwriter-series/">Implementing IXmlWriter Series</a> obsolete for Windows developers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.deez.info/sengelha/2007/07/12/microsofts-xmllite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generating and Parsing Localized Numbers In Windows</title>
		<link>http://www.deez.info/sengelha/2007/07/11/generating-and-parsing-localized-numbers-in-windows/</link>
		<comments>http://www.deez.info/sengelha/2007/07/11/generating-and-parsing-localized-numbers-in-windows/#comments</comments>
		<pubDate>Wed, 11 Jul 2007 06:28:31 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://www.deez.info/sengelha/blog/2007/07/11/generating-and-parsing-localized-numbers-in-windows/</guid>
		<description><![CDATA[
While Windows supports dozens or even hundreds of languages, its localization APIs require quite a bit of getting used to.  Below is how I solved some common problems related to formatting and parsing a number for a specific locale.

Formatting a Number for a Locale

The function GetNumberFormat() formats a number for a particular locale.  [...]]]></description>
			<content:encoded><![CDATA[<p>
While Windows supports dozens or even hundreds of languages, its localization APIs require quite a bit of getting used to.  Below is how I solved some common problems related to formatting and parsing a number for a specific locale.
</p>
<h3>Formatting a Number for a Locale</h3>
<p>
The function <a href="http://msdn2.microsoft.com/en-us/library/ms776317.aspx">GetNumberFormat()</a> formats a number for a particular locale.  Its simplest usage looks something like:
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#define ARRAYSIZE(x) ( sizeof(x) / sizeof(x[0]) )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">TCHAR buf<span class="br0">&#91;</span><span class="nu0">80</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> ret = GetNumberFormat</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; LOCALE_USER_DEFAULT, <span class="co1">// locale</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="nu0">0</span>, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// dwFlags</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; TEXT<span class="br0">&#40;</span><span class="st0">&quot;1234567.89&quot;</span><span class="br0">&#41;</span>, &nbsp;<span class="co1">// lpValue</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">NULL</span>, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// lpFormat</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; buf, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// lpNumberStr</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ARRAYSIZE<span class="br0">&#40;</span>buf<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; <span class="co1">// cchNumber</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">ASSERT</span><span class="br0">&#40;</span>ret != <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>
<code>buf</code> now contains the number 1234567.89 formatted for the user&#8217;s default locale.  For example, for the English-United States locale, <code>buf</code> will contain &#8220;1,234,567.89&#8243;; for German-Germany, &#8220;1.234.567,89&#8243;; for Hindi, &#8220;12,34,567.89&#8243;.
</p>
<p>
The format of the <code>lpValue</code> parameter is important.  From <a href="http://msdn2.microsoft.com/en-us/library/ms776317.aspx">GetNumberFormat()&#8217;s MSDN documentation</a>:
</p>
<blockquote>
<dl>
<dt>lpValue</dt>
<dd>
<p>[in] Pointer to a null-terminated string containing the number string to format. This string can only contain the following characters. All other characters are invalid. The function returns an error if the string indicated by lpValue deviates from these rules.</p>
<ul>
<li>Characters &#8216;0&#8242; through &#8216;9&#8242;.</li>
<li>One decimal point (dot) if the number is a floating-point value.</li>
<li>A minus sign in the first character position if the number is a negative value.</li>
</ul>
</dd>
</dl>
</blockquote>
<p>
Given these constraints, I&#8217;ve found the easiest way to convert, say, a <code>double</code> to a string for use as <code>lpValue</code> is to use <a href="http://msdn2.microsoft.com/en-us/library/ms647541.aspx">StringCchPrintf()</a> (or, equivalently, <a href="http://msdn2.microsoft.com/en-us/library/ms538700.aspx">wnsprintf()</a> or <a href="http://msdn2.microsoft.com/en-us/library/2ts7cx93(vs.71).aspx">_sntprintf()</a>), as in:
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">int</span> GetNumberFormatDbl<span class="br0">&#40;</span>LCID locale, DWORD dwFlags, <span class="kw4">double</span> value,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">const</span> NUMBERFMT* lpFormat, LPTSTR lpNumberStr,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">int</span> cchNumber<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">// DBL_MAX is 1.7976931348623158e+308 and 317 characters</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// (including null terminator)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; TCHAR szBuf<span class="br0">&#91;</span><span class="nu0">317</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; HRESULT hr = StringCchPrintf<span class="br0">&#40;</span>szBuf, ARRAYSIZE<span class="br0">&#40;</span>szBuf<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TEXT<span class="br0">&#40;</span><span class="st0">&quot;%lf&quot;</span><span class="br0">&#41;</span>, value<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hr != S_OK<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; SetLastError<span class="br0">&#40;</span>ERROR_INVALID_PARAMETER<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> GetNumberFormat<span class="br0">&#40;</span>locale, dwFlags, szBuf, lpFormat,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lpNumberStr, cchNumber<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>
One caveat: GetNumberFormatDbl() does not deal well with very small numbers (below 1e-5 or so).
</p>
<h3>Parsing a Localized Number String</h3>
<p>
I spent a lot of time trying to figure out the best way to parse a localized number string until Michael Kaplan <a href="http://blogs.msdn.com/michkap/archive/2007/02/10/1640807.aspx">mentioned</a> <a href="http://msdn2.microsoft.com/en-us/library/ms221634.aspx">VariantChangeTypeEx()</a>.  Once I had that, the rest was (relatively) easy:
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Convert szStr to a BSTR. &nbsp;Returns NULL on failure. &nbsp;Result must be</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// freed with SysFreeString.</span></div>
</li>
<li class="li1">
<div class="de1">BSTR TstrToBstr<span class="br0">&#40;</span>LPCTSTR szStr<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">#if defined(UNICODE)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> SysAllocString<span class="br0">&#40;</span>szStr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; BSTR bstrRet = <span class="kw2">NULL</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> cch = MultiByteToWideChar<span class="br0">&#40;</span>CP_ACP, <span class="nu0">0</span>, szStr, <span class="nu0">-1</span>, <span class="kw2">NULL</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>cch != <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; WCHAR* pswz = <span class="kw3">new</span> WCHAR<span class="br0">&#91;</span>cch<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; cch = MultiByteToWideChar<span class="br0">&#40;</span>CP_ACP, <span class="nu0">0</span>, szStr, <span class="nu0">-1</span>, pswz, cch<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>cch != <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bstrRet = SysAllocString<span class="br0">&#40;</span>pswz<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">delete</span><span class="br0">&#91;</span><span class="br0">&#93;</span> pswz;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> bstrRet;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Converts the localized number string szNumber to a double using the</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// given locale. &nbsp;Returns TRUE and sets *pVal on success, FALSE</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// otherwise.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">BOOL</span> LocalizedStrToDbl<span class="br0">&#40;</span>LCID lcid, LPCTSTR szNumber, <span class="kw4">double</span>* pVal<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">BOOL</span> bSuccess = <span class="kw2">FALSE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Set out parameter regardless</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; *pVal = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; BSTR bstr = TstrToBstr<span class="br0">&#40;</span>szNumber<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>bstr != <span class="kw2">NULL</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; VARIANT var;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; VariantInit<span class="br0">&#40;</span>&amp;var<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// bstr will be freed on VariantClear</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; var.<span class="me1">bstrVal</span> = bstr;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; var.<span class="me1">vt</span> = VT_BSTR;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; HRESULT hr = VariantChangeTypeEx<span class="br0">&#40;</span>&amp;var, &amp;var, lcid, <span class="nu0">0</span>, VT_R8<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hr == S_OK<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *pVal = var.<span class="me1">dblVal</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bSuccess = <span class="kw2">TRUE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; VariantClear<span class="br0">&#40;</span>&amp;var<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> bSuccess;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>
Using <a href="http://msdn2.microsoft.com/en-us/library/ms221331.aspx">VarR8FromStr()</a> instead of VariantChangeTypeEx() is also an option.
</p>
<h3>Customizing of the Output of GetNumberFormat()</h3>
<p>
If you pass <code>NULL</code> as the <code>lpFormat</code> parameter to GetNumberFormat(), you use the locale&#8217;s default number formatting information.  I often find this to be unacceptable &mdash; for example, many times I want to control the number of fractional digits I display.  To do this, you need to provide a filled-in <a href="http://msdn2.microsoft.com/en-us/library/ms776337.aspx"><code>NUMBERFMT</code></a> structure to GetNumberFormat().
</p>
<p>
I suggest starting with the locale&#8217;s default <code>NUMBERFMT</code> and then change only the members you require.  Because Windows does not seem to provide a way to retrieve a locale&#8217;s default <code>NUMBERFMT</code>, we&#8217;ll have to roll our own.
</p>
<p>
To populate the members of <code>NUMBERFMT</code> we are going to use the function <a href="http://msdn2.microsoft.com/en-us/library/ms776270.aspx">GetLocaleInfo()</a>.  The map between <code>NUMBERFMT</code> members and <code>LCTYPE</code>s to pass to GetLocaleInfo() is as follows:
</p>
<table border="1">
<tr>
<th>NUMBERFMT Member</th>
<th>LCTYPE Constant</th>
</tr>
<tr>
<td>NumDigits</td>
<td>LOCALE_IDIGITS</td>
<tr>
<tr>
<td>LeadingZero</td>
<td>LOCALE_ILZERO</td>
<tr>
<tr>
<td>Grouping</td>
<td>LOCALE_SGROUPING</td>
<tr>
<tr>
<td>lpDecimalSep</td>
<td>LOCALE_SDECIMAL</td>
<tr>
<tr>
<td>lpThousandSep</td>
<td>LOCALE_STHOUSAND</td>
<tr>
<tr>
<td>NegativeOrder</td>
<td>LOCALE_INEGNUMBER</td>
<tr>
</table>
<p>
GetLocaleInfo() always returns strings, but many of these strings need to be converted to <code>UINT</code>s.  Furthermore, the conversion between the <code>LOCALE_SGROUPING</code> string and the <code>Grouping</code> member is quite tricky; read <a href="http://blogs.msdn.com/oldnewthing/archive/2006/04/18/578251.aspx">How to fill in that number grouping member of NUMBERFMT</a> for more information.
</p>
<p>
We now have enough information to write the function to retrieve a locale-default NUMBERFMT:
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Converts a grouping string returned by</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// GetLocaleInfo(LOCALE_SGROUPING) into a UINT understood by NUMBERFMT.</span></div>
</li>
<li class="li1">
<div class="de1">UINT GroupingStrToUint<span class="br0">&#40;</span>LPCTSTR szGrouping<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; LPCTSTR szCurr = szGrouping;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; UINT ret = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; ret *= <span class="nu0">10</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>*szCurr == TEXT<span class="br0">&#40;</span><span class="st0">&#8216;<span class="es0">\\</span>0&#8242;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; TCHAR* pch;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; ret += _tcstol<span class="br0">&#40;</span>szCurr, &amp;pch, <span class="nu0">10</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>_tcscmp<span class="br0">&#40;</span>pch, TEXT<span class="br0">&#40;</span><span class="st0">&quot;;0&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; szCurr = pch + <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> ret;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Fills the default NUMBERFMT structure for a given locale.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// pFmt-&gt;lpDecimalSep and pFmt-&gt;lpThousandSep must point to valid</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// buffers of size cchDecimalSep and cchThousandSep respectively.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">BOOL</span> GetDefaultNumberFmt<span class="br0">&#40;</span>LCID lcid, NUMBERFMT* pFmt, <span class="kw4">int</span> cchDecimalSep,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">int</span> cchThousandSep<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; TCHAR szBuf<span class="br0">&#91;</span><span class="nu0">80</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> ret = ::<span class="me2">GetLocaleInfo</span><span class="br0">&#40;</span>lcid, LOCALE_IDIGITS, szBuf,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ARRAYSIZE<span class="br0">&#40;</span>szBuf<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ret == <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">FALSE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; pFmt-&gt;NumDigits = _tcstol<span class="br0">&#40;</span>szBuf, <span class="kw2">NULL</span>, <span class="nu0">10</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; ret = ::<span class="me2">GetLocaleInfo</span><span class="br0">&#40;</span>lcid, LOCALE_ILZERO, szBuf, ARRAYSIZE<span class="br0">&#40;</span>szBuf<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ret == <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">FALSE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; pFmt-&gt;LeadingZero = _tcstol<span class="br0">&#40;</span>szBuf, <span class="kw2">NULL</span>, <span class="nu0">10</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; ret = ::<span class="me2">GetLocaleInfo</span><span class="br0">&#40;</span>lcid, LOCALE_SGROUPING, szBuf,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ARRAYSIZE<span class="br0">&#40;</span>szBuf<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ret == <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">FALSE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; pFmt-&gt;Grouping = GroupingStrToUint<span class="br0">&#40;</span>szBuf<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ret = ::<span class="me2">GetLocaleInfo</span><span class="br0">&#40;</span>lcid, LOCALE_SDECIMAL, pFmt-&gt;lpDecimalSep,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cchDecimalSep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ret == <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">FALSE</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ret = ::<span class="me2">GetLocaleInfo</span><span class="br0">&#40;</span>lcid, LOCALE_STHOUSAND, pFmt-&gt;lpThousandSep,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cchThousandSep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ret == <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">FALSE</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ret = ::<span class="me2">GetLocaleInfo</span><span class="br0">&#40;</span>lcid, LOCALE_INEGNUMBER, szBuf,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ARRAYSIZE<span class="br0">&#40;</span>szBuf<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ret == <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">FALSE</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; pFmt-&gt;NegativeOrder = _tcstol<span class="br0">&#40;</span>szBuf, <span class="kw2">NULL</span>, <span class="nu0">10</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">TRUE</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>
Now that we have these functions, we can use them to better control the output from GetNumberFormat(), as in:
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Converts the double value to a localized string for the specified</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// locale with the given number of fractional digits.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">BOOL</span> DblToLocalizedStr<span class="br0">&#40;</span>LCID lcid, <span class="kw4">double</span> value, <span class="kw4">int</span> nDigits,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LPTSTR szStr, <span class="kw4">int</span> cchStr<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Get locale-default NUMBERFMT</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; TCHAR szDecimalSep<span class="br0">&#91;</span><span class="nu0">5</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; TCHAR szThousandSep<span class="br0">&#91;</span><span class="nu0">5</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; NUMBERFMT fmt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; fmt.<span class="me1">lpDecimalSep</span> = szDecimalSep;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; fmt.<span class="me1">lpThousandSep</span> = szThousandSep;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!GetDefaultNumberFmt<span class="br0">&#40;</span>lcid, &amp;fmt, ARRAYSIZE<span class="br0">&#40;</span>szDecimalSep<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ARRAYSIZE<span class="br0">&#40;</span>szThousandSep<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">FALSE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Override the NumDigits member of NUMBERFMT</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; fmt.<span class="me1">NumDigits</span> = nDigits;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">// Format the number with the custom NUMBERFMT</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> ret = GetNumberFormatDbl<span class="br0">&#40;</span>lcid, <span class="nu0">0</span>, value, &amp;fmt, szStr, cchStr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>ret != <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.deez.info/sengelha/2007/07/11/generating-and-parsing-localized-numbers-in-windows/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Vista Does Not Virtualize Creation Of Shell Links</title>
		<link>http://www.deez.info/sengelha/2007/05/24/vista-does-not-virtualize-creation-of-shell-links/</link>
		<comments>http://www.deez.info/sengelha/2007/05/24/vista-does-not-virtualize-creation-of-shell-links/#comments</comments>
		<pubDate>Thu, 24 May 2007 17:19:29 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://www.deez.info/sengelha/blog/2007/05/24/vista-does-not-virtualize-creation-of-shell-links/</guid>
		<description><![CDATA[
Windows Vista developers beware: Vista does not perform file virtualization on the creation of shell links.  Consider the following code:




// Creates a shell link (a.k.a. shortcut) located at swzLinkFile that


// points to szTargetFile with a description of szDescription.


BOOL CreateLink&#40;LPCTSTR szTargetFile, LPCTSTR szDescription,


&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; LPCOLESTR swzLinkFile&#41;


&#123;


&#160; &#160; BOOL bRet [...]]]></description>
			<content:encoded><![CDATA[<p>
Windows Vista developers beware: Vista does not perform file virtualization on the creation of shell links.  Consider the following code:
</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Creates a shell link (a.k.a. shortcut) located at swzLinkFile that</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// points to szTargetFile with a description of szDescription.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">BOOL</span> CreateLink<span class="br0">&#40;</span>LPCTSTR szTargetFile, LPCTSTR szDescription,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LPCOLESTR swzLinkFile<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">BOOL</span> bRet = <span class="kw2">FALSE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; IShellLink* psl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; HRESULT hr = ::<span class="me2">CoCreateInstance</span><span class="br0">&#40;</span>CLSID_ShellLink, <span class="kw2">NULL</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CLSCTX_INPROC_SERVER,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IID_IShellLink,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw4">void</span>**<span class="br0">&#41;</span> &amp;psl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>SUCCEEDED<span class="br0">&#40;</span>hr<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; IPersistFile* ppf;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; hr = psl-&gt;QueryInterface<span class="br0">&#40;</span>IID_IPersistFile, <span class="br0">&#40;</span><span class="kw4">void</span>**<span class="br0">&#41;</span> &amp;ppf<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>SUCCEEDED<span class="br0">&#40;</span>hr<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = psl-&gt;SetPath<span class="br0">&#40;</span>szTargetFile<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>SUCCEEDED<span class="br0">&#40;</span>hr<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = psl-&gt;SetDescription<span class="br0">&#40;</span>szDescription<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>SUCCEEDED<span class="br0">&#40;</span>hr<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = ppf-&gt;Save<span class="br0">&#40;</span>swzLinkFile, <span class="kw2">TRUE</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>SUCCEEDED<span class="br0">&#40;</span>hr<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bSuccess = <span class="kw2">TRUE</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ppf-&gt;Release<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; psl-&gt;Release<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> bSuccess;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// NOTE: Hardcoding C:\\WINDOWS and C:\\Program Files is a bad practice.</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Use something like ::SHGetFolderPath().</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">BOOL</span> bSuccess = CreateLink</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; _T<span class="br0">&#40;</span><span class="st0">&quot;C:<span class="es0">\\</span>WINDOWS<span class="es0">\\</span>SYSTEM32<span class="es0">\\</span>SOL.EXE&quot;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; _T<span class="br0">&#40;</span><span class="st0">&quot;Shortcut to SOL.EXE&quot;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; L<span class="st0">&quot;C:<span class="es0">\\</span>Program Files<span class="es0">\\</span>sol.lnk&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>
One might expect that the creation of the file <code>C:\Program Files\sol.lnk</code> would be silently redirected by Vista using file virtualization and <code>CreateLink()</code> would succeed, but it doesn&#8217;t &#8212; the call to <code>IPersistFile::Save()</code> returns <code>E_ACCESSDENIED</code>.
</p>
<p>
For more information about developing on Vista, see the document <a href="http://www.microsoft.com/downloads/details.aspx?familyid=ba73b169-a648-49af-bc5e-a2eebb74c16b&amp;displaylang=en">Windows Vista Application Development Requirements for User Account Control Compatibility</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.deez.info/sengelha/2007/05/24/vista-does-not-virtualize-creation-of-shell-links/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugging Crashes in Windows Applications Part 1: The Null Pointer Dereference</title>
		<link>http://www.deez.info/sengelha/2007/04/25/debugging-crashes-in-windows-applications-part-1-the-null-pointer-dereference/</link>
		<comments>http://www.deez.info/sengelha/2007/04/25/debugging-crashes-in-windows-applications-part-1-the-null-pointer-dereference/#comments</comments>
		<pubDate>Wed, 25 Apr 2007 20:06:23 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://www.deez.info/sengelha/blog/2007/04/25/understanding-the-windows-crash-dialog-part-1-the-null-pointer-dereference/</guid>
		<description><![CDATA[
Windows C++ developers remain all too familiar with the standard Windows crash dialog.  This post is an attempt to teach developers how to understand the data the crash dialog reports to diagnose difficult issues.  A basic understanding of assembly language is assumed; for more background on these topics please read Matt Pietrek&#8217;s &#8220;Under [...]]]></description>
			<content:encoded><![CDATA[<p>
Windows C++ developers remain all too familiar with the standard Windows crash dialog.  This post is an attempt to teach developers how to understand the data the crash dialog reports to diagnose difficult issues.  A basic understanding of assembly language is assumed; for more background on these topics please read Matt Pietrek&#8217;s &#8220;Under The Hood&#8221; articles in the <i>Microsoft Systems Journal</i> <a href="http://www.microsoft.com/msj/0298/hood0298.aspx">February 1998</a> and <a href="http://www.microsoft.com/msj/0698/hood0698.aspx">June 1998</a> issues.
</p>
<p><span id="more-5349"></span></p>
<p>
To begin with, let&#8217;s write an application that crashes with a null pointer dereference:
</p>
<pre>
// DerefNullPointer.c: Crash by dereferencing the null pointer.

static void DoCrash()
{
    *((char*) 0) = 1;
}

int main(int argc, char* argv[])
{
    DoCrash();
    return 0;
}
</pre>
<p>
I placed the null pointer dereference in its own function for reasons that will later become clear.  Now, let&#8217;s compile the application from the command line:
</p>
<pre>
C:\\Proj\\Crashes&gt; cl /Od /nologo /c DerefNullPtr.c
C:\\Proj\\Crashes&gt; link /SUBSYSTEM:CONSOLE /OUT:DerefNullPtr.exe DerefNullPtr.obj
</pre>
<p>
Now run the application:
</p>
<pre>
C:\\Proj\\Crashes> DerefNullPtr
</pre>
<p>
The standard Windows crash dialog pops up:
</p>
<p><a href='http://www.deez.info/sengelha/wp-content/uploads/2007/04/nullptrcrashdialog.PNG' title='Null Pointer Dereference Windows Crash Dialog'><img src='http://www.deez.info/sengelha/wp-content/uploads/2007/04/nullptrcrashdialog.thumbnail.PNG' alt='Null Pointer Dereference Windows Crash Dialog' /></a></p>
<p>
Normally users will click &#8220;Send Error Report&#8221; or &#8220;Don&#8217;t Send&#8221;.  If you have access to the machine and a debugger installed you can click &#8220;Debug&#8221;.  Alternatively, you can view the error report details right away by clicking &#8220;click here.&#8221;  If you do, the following dialog pops up:
</p>
<p><a href='http://www.deez.info/sengelha/wp-content/uploads/2007/04/nullptrerrorreport.PNG' title='Null Pointer Dereference Error Report'><img src='http://www.deez.info/sengelha/wp-content/uploads/2007/04/nullptrerrorreport.thumbnail.PNG' alt='Null Pointer Dereference Error Report' /></a></p>
<p>
As you can see, I have put what I consider the most important piece of information from this dialog into a red box: the offset of the instruction which caused the crash.  Note that this value is <i>an offset</i> &#8212; it&#8217;s the address of the crashing instruction relative to where <code>DerefNullPtr.exe</code> is loaded into memory.
</p>
<p>
We now have enough information to see the instruction which is causing the crash.  One way to do this is to use <a href="http://blogs.msdn.com/doronh/">Doron Holan</a>&#8217;s <a href="http://blogs.msdn.com/doronh/archive/2006/03/10/549036.aspx">windbg<sup>1</sup> dump file trick</a>:
</p>
<pre>
C:\\Proj\\Crashes> windbg -z DerefNullPtr.exe

Microsoft (R) Windows Debugger  Version 6.6.0003.5
Copyright (c) Microsoft Corporation. All rights reserved.

Loading Dump File [C:\\Proj\\Crashes\\DerefNullPtr.exe]
Symbol search path is: SRV*C:\\websymbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
ModLoad: 00400000 00408000   C:\\Proj\\Crashes\\DerefNullPtr.exe
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
eip=00401041 esp=00000000 ebp=00000000 iopl=0         nv up di pl nz na pe nc
cs=0000  ss=0000  ds=0000  es=0000  fs=0000  gs=0000             efl=00000000
*** WARNING: Unable to verify checksum for DerefNullPtr.exe
*** ERROR: Module load completed but symbols could not be loaded for DerefNullPtr.exe
DerefNullPtr+0x1041:
00401041 6a18             push    0x18
0:000> <span style="color:red;">u DerefNullPtr+0x1013</span>
DerefNullPtr+0x1013:
<span style="color:red;">00401013 c6050000000001   mov     byte ptr [00000000],0x1</span>
0040101a 5d               pop     ebp
0040101b c3               ret
0040101c 833dc872400002   cmp  dword ptr [DerefNullPtr+0x72c8 (004072c8)],0x2
00401023 7405             jz      DerefNullPtr+0x102a (0040102a)
00401025 e8f0040000       call    DerefNullPtr+0x151a (0040151a)
0040102a ff742404         push    dword ptr [esp+0x4]
0040102e e870030000       call    DerefNullPtr+0x13a3 (004013a3)
</pre>
<p>
The crashing instruction is <code>mov byte ptr [00000000],0x1</code>.  Clearly the bug is a null pointer dereference.
</p>
<p>
Had we produced a <a href="http://msdn2.microsoft.com/en-us/library/k7xkk3e2(VS.80).aspx">map file</a> at link time, we could have done even better.  Let me show you:
</p>
<pre>
C:\\Proj\\Crashes> link /SUBSYSTEM:CONSOLE /MAP:DerefNullPtr.map /OUT:DerefNullPtr.exe DerefNullPtr.obj
</pre>
<p>
The map file looks like:
</p>
<pre>
 DerefNullPtr

 Timestamp is 462fae49 (Wed Apr 25 14:38:49 2007)

 Preferred load address is 00400000

 Start         Length     Name                   Class
 0001:00000000 00003b68H .text                   CODE
 0002:00000000 000000c4H .idata$5                DATA
...
 0003:00000030 00000274H .data                   DATA
 0003:000002c0 00000598H .bss                    DATA

  Address         Publics by Value              Rva+Base     Lib:Object

 0000:00000000       __except_list              00000000     &lt;absolute>
 0000:00000002       ___safe_se_handler_count   00000002     &lt;absolute>
 0001:00000000       _main                      00401000 f   DerefNullPtr.obj
 0001:0000001c       __amsg_exit                0040101c f   LIBC:crt0.obj
 0001:00000041       _mainCRTStartup            00401041 f   LIBC:crt0.obj
...
 0003:00000850       __FPinit                   00407850     &lt;common>
 0003:00000854       __acmdln                   00407854     &lt;common>

 entry point at        0001:00000041

 Static symbols

 <span style="color:red;">0001:00000010       _DoCrash                   00401010 f   DerefNullPtr.obj</span>
 0001:000002a2       _doexit                    004012a2 f   LIBC:crt0dat.obj
 0001:0000078b       _parse_cmdline             0040178b f   LIBC:stdargv.obj
</pre>
<p>
The first thing to note is that all addresses in the map file are relative to the preferred load address, <code>0x00400000</code>.  Therefore, we&#8217;re looking for the function which contains the address <code>0x00400000 + 0x00001013 = 0x00401013</code>.  To do so, we should look for the function which has the largest address less than or equal to the address of the crash.  The function <code>_DoCrash()</code> is at the address <code>0x00401010</code>, so the crash appears to be at the address <code>_DoCrash+0x3</code>.
</p>
<p>
Better still is to create a <code>PDB</code> file alongside your retail builds, as in:
</p>
<pre>
C:\\Proj\\Crashes> cl /Zi /Od /nologo /c DerefNullPtr.c
C:\\Proj\\Crashes> link /DEBUG /SUBSYSTEM:CONSOLE /PDB:DerefNullPtr.pdb /MAP:DerefNullPtr.map /OUT:DerefNullPtr.exe DerefNullPtr.obj
</pre>
<p>
Note that the <a href="http://msdn2.microsoft.com/en-us/library/xe4t6fc1(VS.71).aspx"><code>/DEBUG</code></a> option may be a little confusing &mdash; it really should named <code>/CREATEPDB</code>.
</p>
<p>
Unfortunately, this change will invalidate the previous crash address.  (This wouldn&#8217;t be a problem if building retail PDBs was part of your normal process)  However, we can reproduce the bug within the debugger:
</p>
<pre>
C:\\Proj\\Crashes> windbg DerefNullPtr.exe

Microsoft (R) Windows Debugger  Version 6.6.0003.5
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: DerefNullPtr.exe
Symbol search path is: SRV*C:\\websymbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
ModLoad: 00400000 0040d000   DerefNullPtr.exe
ModLoad: 7c900000 7c9b0000   ntdll.dll
ModLoad: 7c800000 7c8f4000   C:\\WINDOWS\\system32\\kernel32.dll
(3e4.7f4): Break instruction exception - code 80000003 (first chance)
eax=00241eb4 ebx=7ffd9000 ecx=00000000 edx=00000001 esi=00241f48 edi=00241eb4
eip=7c901230 esp=0012fb20 ebp=0012fc94 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c901230 cc               int     3
0:000> <span style="color:red;">g</span>
(3e4.7f4): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=003214a8 ebx=7ffd9000 ecx=00000001 edx=7c90eb94 esi=00000a28 edi=00000000
eip=00401023 esp=0012fedc ebp=0012fedc iopl=0         nv up ei pl zr na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
*** WARNING: Unable to verify checksum for DerefNullPtr.exe
<span style="color:red;">DerefNullPtr!DoCrash+0x3:
00401023 c6050000000001   mov     byte ptr [00000000],0x1 ds:0023:00000000=??</span>
0:000> <span style="color:red;">kb</span>
ChildEBP RetAddr  Args to Child
<span style="color:red;">0012fedc 00401018 0012ffc0 00401245 00000001 DerefNullPtr!DoCrash+0x3 [c:\\proj\\crashes\\derefnullptr.c @ 3]</span>
0012fee4 00401245 00000001 00321470 003214a8 DerefNullPtr!main+0x8 [c:\\proj\\crashes\\derefnullptr.c @ 9]
0012ffc0 7c816fd7 00090000 00a7fa9c 7ffd9000 DerefNullPtr!mainCRTStartup+0x173 [f:\\vs70builds\\3077\\vc\\crtbld\\crt\\src\\crt0.c @ 259]
0012fff0 00000000 004010d2 00000000 78746341 kernel32!BaseProcessStart+0x23
</pre>
<p>
Using PDBs, you have the ability to map instruction addresses to a file and line number, <i>even with retail builds</i>.  I recommend producing PDBs as part of your build process and placing them somewhere accessible by all developers on your team.
</p>
<p style="font-size: 90%;">
1. Windbg is an extremely powerful debugger included with Microsoft&#8217;s free <a href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx">Debugging Tools for Windows</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.deez.info/sengelha/2007/04/25/debugging-crashes-in-windows-applications-part-1-the-null-pointer-dereference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
