<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Zhanli's tech notes</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/zhanli/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/zhanli/feed.xml</link>
    <description>stuff about SQL Server, Debugging, Windows, Coding and more......</description>
    <lastBuildDate>Tue, 16 Apr 2019 05:37:01 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>How to detect whether the connection to SQL Server is broken or not</title>
      <link>https://docs.microsoft.com/archive/blogs/zhanli/how-to-detect-whether-the-connection-to-sql-server-is-broken-or-not</link>
      <pubDate>Wed, 04 Jan 2012 00:27:33 GMT</pubDate>
      <dc:creator><![CDATA[Zhan Li [MS]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/zhanli/2012/01/04/how-to-detect-whether-the-connection-to-sql-server-is-broken-or-not/</guid>
      <description><![CDATA[&#160;  For managed code, use SqlConnection’s StateChange event:  &#160;...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>For managed code, use SqlConnection’s StateChange event:</p>  <p>&#160;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; static void Main(string[] args)   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; SqlConnection conn = new SqlConnection();</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font style="background-color: #ffff00">conn.StateChange += ConnStateChangeEventHandler;</font></p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; conn.ConnectionString = &quot;server=yourServerName; uid=yourUserName; pwd=xxxx; database=northwind&quot;;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; conn.Open();</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; SqlCommand cmd = new SqlCommand();    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cmd.Connection = conn;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cmd.CommandText = &quot;select * from customer&quot;;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cmd.ExecuteNonQuery();   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; catch (SqlException ex)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(ex.Message);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.ReadKey();</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; private static void ConnStateChangeEventHandler(Object sender, StateChangeEventArgs args)   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font style="background-color: #ffff00">Console.WriteLine(&quot;old state: {0}, new state: {1}&quot;, args.OriginalState, args.CurrentState);     <br /></font>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>  <p>&#160;</p>  <p>For ODBC application, use SQLGetConnectAttr to check the SQL_COPT_SS_CONNECTION_DEAD attribute:</p>  <p>&#160;</p>  <p>UINT connection_state = SQL_CD_FALSE;   <br />&#160; <br />// check if the connection is broken    <br />SQLGetConnectAttr(hdbc, SQL_COPT_SS_CONNECTION_DEAD, &amp;connection_state, SQL_IS_UINTEGER, NULL);</p>  <p>if (connection_state == SQL_CD_TRUE )   <br />{    <br />&#160;&#160;&#160; cout &lt;&lt; “connection broken” &lt;&lt; endl;    <br />}</p>]]></content:encoded>
    </item>
    <item>
      <title>C++ small gotcha - 3</title>
      <link>https://docs.microsoft.com/archive/blogs/zhanli/c-small-gotcha-3</link>
      <pubDate>Fri, 30 Dec 2011 22:47:00 GMT</pubDate>
      <dc:creator><![CDATA[Zhan Li [MS]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/zhanli/2011/12/30/c-small-gotcha-3/</guid>
      <description><![CDATA[Have two class as below:
&nbsp;
struct&nbsp;MyBase
{
&nbsp; __int64&nbsp;x;
&nbsp;...]]></description>
      <content:encoded><![CDATA[<p>Have two class as below:</p>
<p>&nbsp;</p>
<p>struct&nbsp;MyBase</p>
<p>{</p>
<p>&nbsp; __int64&nbsp;x;</p>
<p>&nbsp; __int64&nbsp;y;</p>
<p>&nbsp; MyBase()</p>
<p>&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(this,&nbsp;0,&nbsp;sizeof(MyBase));</p>
<p>&nbsp; }</p>
<p>};</p>
<p>&nbsp;</p>
<p>struct&nbsp;MyDerived:&nbsp;public&nbsp;MyBase</p>
<p>{</p>
<p>&nbsp; int&nbsp;z;</p>
<p>&nbsp; MyDerived():MyBase(),&nbsp;z(0)</p>
<p>&nbsp; {}</p>
<p>};</p>
<p>&nbsp;</p>
<p>Then create two objects as below, and then compare these two<br />objects with memcmp, do you think the c compare will be equal since the<br />constructor has initialized all the members of the objects to be 0?</p>
<pre>MyDerived&nbsp;obj1;</pre>
<pre>MyDerived&nbsp;obj2;</pre>
<pre>&nbsp;</pre>
<pre>if&nbsp;(memcmp(&amp;obj1,&nbsp;&amp;obj2,&nbsp;sizeof(MyDerived))&nbsp;==&nbsp;0)</pre>
<pre>{</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&nbsp;&lt;&lt;&nbsp;"equal"&nbsp;&lt;&lt;&nbsp;endl;</pre>
<pre>}</pre>
<p>&nbsp;</p>
<p>The answer is no. Since due to data alignment, the size of<br />MyDerived is 24 bytes, although the constructor has initialized x, y and z to<br />0, there are still 4 bytes keeps uninitialized, so they may be equal or not.</p>]]></content:encoded>
    </item>
    <item>
      <title>C++ small gotcha - 2</title>
      <link>https://docs.microsoft.com/archive/blogs/zhanli/c-small-gotcha-2</link>
      <pubDate>Thu, 29 Dec 2011 05:13:29 GMT</pubDate>
      <dc:creator><![CDATA[Zhan Li [MS]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/zhanli/2011/12/29/c-small-gotcha-2/</guid>
      <description><![CDATA[What&rsquo;s wrong with the below code:
// a wrapper class which holds memory that&rsquo;s...]]></description>
      <content:encoded><![CDATA[<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">What&rsquo;s wrong with the below code:</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">// a wrapper class which holds memory that&rsquo;s allocated </span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">// by using new []</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">template&lt;class T&gt;</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">class ArrayWrapper</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">{</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">public:</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">&nbsp;&nbsp;&nbsp; ArrayWrapper(T* pData = NULL)</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">&nbsp;&nbsp;&nbsp; {</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_pData = pData;</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">&nbsp;&nbsp;&nbsp; ~ArrayWrapper()</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">&nbsp;&nbsp;&nbsp; {</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] m_pData;</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">private:</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">&nbsp;&nbsp;&nbsp; T* m_pData;</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">};</span></span></p>
<p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></p>
<p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">// code that use this class</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">{</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">&nbsp;&nbsp;&nbsp; ArrayWrapper&lt;WCHAR&gt; buffer;</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">&nbsp;&nbsp;&nbsp; buffer = new WCHAR[20];</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">}</span></span></p>
<p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Answer:</span></span></p>
<p><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">The first statement creates a new ArrayWrapper&lt;WCHAR&gt; object buffer which is initialized with NULL. The second statement create a temporary object, which is initialized with the address that is returned by the operator new, then the compiler copy the temporary object to buffer, then it call the destructor of the temporary object, this causes the memory to be freed. When the buffer object is out of scope, the same memory will be freed again and you have a double free issue.</span></span></p>
<p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></p>]]></content:encoded>
    </item>
    <item>
      <title>C++ small gotcha</title>
      <link>https://docs.microsoft.com/archive/blogs/zhanli/c-small-gotcha</link>
      <pubDate>Fri, 20 May 2011 01:26:00 GMT</pubDate>
      <dc:creator><![CDATA[Zhan Li [MS]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/zhanli/2011/05/20/c-small-gotcha/</guid>
      <description><![CDATA[Suppose str1 and str2 points to the same zero terminated string, will str1 and str2 be the same...]]></description>
      <content:encoded><![CDATA[<p>Suppose str1 and str2 points to the same zero terminated string, will str1 and str2 be the same value after running below while loop?</p>
<p>while(*str1)</p>
<p>{</p>
<p>str1++;</p>
<p>};</p>
<p>while(*str2++);</p>
<p>Answer:</p>
<p>Str1 points to the terminating zero of the string. But str2 points to the memory address after the zero.</p>
<p>See the assembly of &ldquo;while(*str2++);&rdquo; will reveals how this statement work:</p>
<p>while(*str2++);</p>
<p>01043505 mov eax,dword ptr [str2] </p>
<p>01043508 mov cl,byte ptr [eax] </p>
<p>0104350A mov byte ptr [ebp-0F1h],cl </p>
<p>01043510 mov edx,dword ptr [str2] </p>
<p>01043513 add edx,1 </p>
<p>01043516 mov dword ptr [str2],edx </p>
<p>01043519 movsx eax,byte ptr [ebp-0F1h] </p>
<p>01043520 test eax,eax </p>
<p>01043522 je ReverseStr+66h (1043526h) </p>
<p>01043524 jmp ReverseStr+45h (1043505h) </p>
<p>We can see it will fetch the value from the memory address pointed by str2 to eax, then increase str2 by 1 and then test if the eax is zero. The fetch and increase occurs first before the increase, thus cause str2 to point to the address after the terminating zero.</p>
<p>The &ldquo;while(*str2++);&rdquo; statement is the same as this code:</p>
<p>char temp;</p>
<p>do</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = *str3;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str3++;</p>
<p>}while (temp);</p>]]></content:encoded>
    </item>
    <item>
      <title>Design pattern in .NET: iterator</title>
      <link>https://docs.microsoft.com/archive/blogs/zhanli/design-pattern-in-net-iterator</link>
      <pubDate>Mon, 19 Jul 2010 07:06:00 GMT</pubDate>
      <dc:creator><![CDATA[Zhan Li [MS]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/zhanli/2010/07/19/design-pattern-in-net-iterator/</guid>
      <description><![CDATA[The iterator pattern plays very important role in STL. In STL, iterators are the glue between...]]></description>
      <content:encoded><![CDATA[<p>The iterator pattern plays very important role in STL. In STL, iterators are the glue between algorithms and containers. STL algorithms and containers are independent of each other; each STL container implements its own iterator and the STL algorithms use iterators to access the elements of the containers. For example, there is a for_each algorithm in STL that uses iterators to access each element of a container:</p>
<p>void PrintNumber(int number)</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; number &lt;&lt; endl;</p>
<p>}</p>
<p>&nbsp;</p>
<p>int _tmain(int argc, _TCHAR* argv[])&nbsp; </p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int numbers[] = {1,2,3,4,5};</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;int&gt; vi(numbers, numbers+5);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //vi.begin() and vi.end() return two iterators:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for_each(vi.begin(),vi.end(),PrintNumber);</p>
<p>}</p>
<p>&nbsp;</p>
<p>In .NET, you implement the iterator pattern using the IEnumerable and IEnumerator interfaces and their generic version IEnumerable&lt;T&gt; and IEnumerator&lt;T&gt;. IEnumerable returns an IEnumerator object and the IEnumerator objects implement the actual "iterator" code. You can use tools such as Reflector to check the classes such as List&lt;T&gt;, <a href="https://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Collections.Generic.Dictionary%3c,%3e">Dictionary</a>&lt;TKey, TValue&gt; in .NET framework library to see how these classes implement the IEnumerable/ Ienumerable&lt;T&gt; interfaces. .NET language such as C# has more integral support for the iterator pattern, if a class implements the IEnumerale interface, you can use the foreach statement to access each element of the classes.</p>
<p>&nbsp;</p>
<p>The yield return statement makes it even easier to implement the iterator pattern. For example, if you use yield return statement in below class, the compiler will generate code for you and the compiler generated code implements the IEnumerable interface and then you can use the class in the foreach statement, you can use reflector to check the compiler generated code to see how the IEnumerable interface is implemented:</p>
<p>&nbsp;</p>
<p>public class DaysOfTheWeek </p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; string[] m_Days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; public IEnumerable Days()</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; m_Days.Length; i++)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yield return m_Days[i];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>
<p>DaysOfTheWeek obj = new DaysOfTheWeek();</p>
<p>foreach(string day in obj.Days())</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(day);</p>
<p>}&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>How to get high resolution timing info</title>
      <link>https://docs.microsoft.com/archive/blogs/zhanli/how-to-get-high-resolution-timing-info</link>
      <pubDate>Thu, 08 Jul 2010 06:14:00 GMT</pubDate>
      <dc:creator><![CDATA[Zhan Li [MS]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/zhanli/2010/07/08/how-to-get-high-resolution-timing-info/</guid>
      <description><![CDATA[We know that we can use GetTickCount to get timing info but the resolution of this API is limited to...]]></description>
      <content:encoded><![CDATA[<p>We know that we can use GetTickCount to get timing info but the resolution of this API is limited to about 10 milliseconds, see MSDN:</p>
<p><a href="https://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx">https://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx</a></p>
<p style="padding-left: 30px;"><em>The resolution of the GetTickCount function is limited to the resolution of the system timer, which is typically in the range of 10 milliseconds to 16 milliseconds.</em></p>
<p>To get higher resolution timing info, two popular options are:</p>
<p>1. The multimedia timeGetTime function, you can use this API to get 1 millisecond resolution timing info:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TIMECAPS timeCaps = {0};</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //use timeGetDevCaps to get the minimum and maximum</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //resolutions supported by the system</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeGetDevCaps(&amp;timeCaps, sizeof(timeCaps));</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("minimum device resolution is %d millisecond(s)\r\n",timeCaps.wPeriodMin);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("maximum device resolution is %d millisecond(s)\r\n",timeCaps.wPeriodMax);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//use timeBeginPeriod to adjust the timer resolution</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //you cannot set the resolution smaller than timeCaps.wPeriodMin</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MMRESULT result = timeBeginPeriod(timeCaps.wPeriodMin);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(result == TIMERR_NOERROR)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("time resolution set to: %d millisecond(s)\r\n",timeCaps.wPeriodMin);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD ticks1 = timeGetTime();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //doing some operation here</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Sleep(5000);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD ticks2 = timeGetTime();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("time elapsed: %d\r\n",ticks2 - ticks1);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //use timeEndPeriod to clear the resolution adjusted by the previous call //timeBeginPeriod</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeEndPeriod(timeCaps.wPeriodMin);</p>
<p>&nbsp;</p>
<p>Internally, when you call timebeginPeriod to adjust the timer resolution, it calls into ntdll!NtSetTimerResolution which goes into kernel to manipulate the timer hardware. This resolution adjustment can affect the OS thread scheduling behavior and it can affect other applications, applications such as Windows Media Player uses these APIs and we don't see bad effect.</p>
<p>&nbsp;</p>
<p>2. To get even higher resolution timing info, you can use QueryPerformanceFrequency and QueryPerformanceCounter:</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LARGE_INTEGER frequencyPerSec = {0};</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LARGE_INTEGER start = {0};</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LARGE_INTEGER end = {0};</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(QueryPerformanceFrequency(&amp;frequencyPerSec))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueryPerformanceCounter(&amp;start);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //do something here</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueryPerformanceCounter(&amp;end);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("elaplsed time: %I64d second(s)\r\n",</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (end.QuadPart - start.QuadPart)/frequencyPerSec.QuadPart);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>These APIs can get higher resolution but their overhead is higher than timeGetTime also.</p>
<p>&nbsp;</p>
<p>Another option is the rdtsc counter but the currently hardware may have problems for this counter. Currently, SQL Server 2008 uses timtGetTime like mechanism and QueryPerformanceFrequency/QueryPerformanceCounter to get timing info, it does not use rdtsc anymore:</p>
<p>&nbsp;</p>
<p>Issues caused by rdtsc:</p>
<p><a href="https://support.microsoft.com/kb/931279/en-us">https://support.microsoft.com/kb/931279/en-us</a></p>
<p>&nbsp;</p>
<p><a href="https://blogs.msdn.com/b/psssql/archive/2008/12/16/how-it-works-sql-server-no-longer-uses-rdtsc-for-timings-in-sql-2008-and-sql-2005-service-pack-3-sp3.aspx">https://blogs.msdn.com/b/psssql/archive/2008/12/16/how-it-works-sql-server-no-longer-uses-rdtsc-for-timings-in-sql-2008-and-sql-2005-service-pack-3-sp3.aspx</a></p>
<p>&nbsp;</p>
<p><a href="https://blogs.msdn.com/b/psssql/archive/2007/08/19/sql-server-2005-rdtsc-truths-and-myths-discussed.aspx">https://blogs.msdn.com/b/psssql/archive/2007/08/19/sql-server-2005-rdtsc-truths-and-myths-discussed.aspx</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>C++ Tips: Adjustor thunk: what is it, why and how it works</title>
      <link>https://docs.microsoft.com/archive/blogs/zhanli/c-tips-adjustor-thunk-what-is-it-why-and-how-it-works</link>
      <pubDate>Thu, 01 Jul 2010 00:06:00 GMT</pubDate>
      <dc:creator><![CDATA[Zhan Li [MS]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/zhanli/2010/07/01/c-tips-adjustor-thunk-what-is-it-why-and-how-it-works/</guid>
      <description><![CDATA[When you debug C++ applications, you may notice below unusual functions generated by the compile....]]></description>
      <content:encoded><![CDATA[<p>When you debug C++ applications, you may notice below unusual functions generated by the compile. Have you even wondered what the adjustor thunk function is. Why it is needed, and how it works?</p>
<p>00ce10a4 8b06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [esi]<br />00ce10a6 8b10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx,dword ptr [eax]<br />&hellip;&hellip;<br />00ce10ab 8bce&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx,esi<br />00ce10ad ffd2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp; edx {test![<span style="background-color: #ffff00;">thunk</span>]:Derived::Func1`<span style="background-color: #ffff00;">adjustor</span>{4}' (00ce10c0)}</p>
<p>When virtual function and multiple inheritance are involved, Visual C++ use the adjustor thunk technique to solve the vtable layout issue. Below sample code will make it clear how this technique works:</p>
<p style="padding-left: 60px;"><br />#include "stdafx.h"</p>
<p style="padding-left: 60px;">class Interface1<br />{<br />public:<br />&nbsp;virtual void Func1() = 0;<br />&nbsp;virtual void Func2() = 0;<br />};</p>
<p style="padding-left: 60px;">class Base1 : public Interface1<br />{<br />public:<br />&nbsp;virtual void Func1() = 0;<br />&nbsp;virtual void Func2() = 0;<br />};</p>
<p style="padding-left: 60px;">class Base2 : public Interface1<br />{<br />public:<br />&nbsp;virtual void Func1() = 0;<br />&nbsp;virtual void Func2() = 0;<br />};</p>
<p style="padding-left: 60px;">class Derived: public Base1, public Base2<br />{<br />public:<br />&nbsp;Derived(int p1, int p2):m1(p1),m2(p2){}<br />&nbsp;void Func1();<br />&nbsp;void Func2();<br />private:<br />&nbsp;int m1;<br />&nbsp;int m2;<br />};</p>
<p style="padding-left: 60px;">void Derived::Func1()<br />{<br />&nbsp;printf("m1 = %d\r\n",m1);<br />}</p>
<p style="padding-left: 60px;">void Derived::Func2()<br />{<br />&nbsp;printf("m2=%d\r\n",m2);<br />}</p>
<p style="padding-left: 60px;">int _tmain(int argc, _TCHAR* argv[])<br />{<br />&nbsp;Derived* pObj = new Derived(1,2);</p>
<p style="padding-left: 60px;">&nbsp;Base1* pb1 = pObj;</p>
<p style="padding-left: 60px;">&nbsp;printf("called via Base1*, pb1 = 0x%x\r\n",pb1);<br />&nbsp;pb1-&gt;Func1();<br />&nbsp;pb1-&gt;Func2();</p>
<p style="padding-left: 60px;">&nbsp;<br />&nbsp;Base2* pb2 = pObj;<br />&nbsp;printf("called via Base2*, pb2 = 0x%x\r\n",pb2);<br />&nbsp;pb2-&gt;Func1();<br />&nbsp;pb2-&gt;Func2();<br />}</p>
<p>We can see that Derived inherits both Base1 and Base2; and both Base1 and Base2 inherit Interface1. The object inheritance is show in below:</p>
<p>&nbsp;</p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/52/36/7462.objects_inherit.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-52-36/7462.objects_5F00_inherit.png" border="0" /></p>
<p>If you run the code, you can get below results, note that pb1 and pb2 points to different memory address:</p>
<p>called via Base1*, pb1 = <span style="background-color: #ffff00;">0x561cb0</span><br />m1 = 1<br />m2=2<br />called via Base2*, pb2 = <span style="background-color: #ffff00;">0x561cb4</span><br />m1 = 1<br />m2=2</p>
<p>Run the code under windbg, we can see the generated assembly code for function wmain is as follows, and I have highlighted the key points:</p>
<p>0:000&gt; uf test!wmain</p>
<p>1)&nbsp;49 00ce1040 push&nbsp;&nbsp;&nbsp; esi<br />2)&nbsp;50 00ce1041 push&nbsp;&nbsp;&nbsp; 10h<br />3)&nbsp;50 00ce1043 call&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">test!operator new (00ce11f3) &gt;&gt;&gt;call operator new to allocate memory</span><br />4)&nbsp;50 00ce1048 add&nbsp;&nbsp;&nbsp;&nbsp; esp,4<br />5)&nbsp;50 00ce104b test&nbsp;&nbsp;&nbsp; eax,eax<br />6)&nbsp;50 00ce104d je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test!wmain+0x35 (00ce1075)<br />7)&nbsp;50 00ce104f mov&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">dword ptr [eax+4],offset test!Base2::`vftable' (00cea188) &gt;&gt;&gt;Derived constructor begins</span><br />8)&nbsp;50 00ce1056 mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [eax],offset test!Derived::`vftable' (00cea194)<br />9)&nbsp;50 00ce105c mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [eax+4],offset test!Derived::`vftable' (00cea1a0)<br />10)&nbsp;50 00ce1063 mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [eax+8],1<br />11)&nbsp;50 00ce106a mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [eax+0Ch],2<br />12)&nbsp;50 00ce1071 mov&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">esi,eax&nbsp;&nbsp; &gt;&gt;&gt;eax and esi contains the this pointer of pObj<br /></span>13)&nbsp;50 00ce1073 jmp&nbsp;&nbsp;&nbsp;&nbsp; test!wmain+0x37 (00ce1077)<br />14)&nbsp;50 00ce1075 xor&nbsp;&nbsp;&nbsp;&nbsp; esi,esi<br />15)&nbsp;54 00ce1077 push&nbsp;&nbsp;&nbsp; esi<br />16)&nbsp;54 00ce1078 push&nbsp;&nbsp;&nbsp; offset test!`string' (00cea144)<br />17)&nbsp;54 00ce107d call&nbsp;&nbsp;&nbsp; test!printf (00ce10e7)<br />18)&nbsp;55 00ce1082 mov&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [esi]<br />19)&nbsp;55 00ce1084 mov&nbsp;&nbsp;&nbsp;&nbsp; edx,dword ptr [eax]<br />20)&nbsp;55 00ce1086 add&nbsp;&nbsp;&nbsp;&nbsp; esp,8<br />21)&nbsp;55 00ce1089 mov&nbsp;&nbsp;&nbsp;&nbsp; ecx,esi<br />22)&nbsp;55 00ce108b call&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">edx&nbsp;&nbsp; &gt;&gt;&gt;call pb1-&gt;Func1()</span><br />23)&nbsp;56 00ce108d mov&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [esi]<br />24)&nbsp;56 00ce108f mov&nbsp;&nbsp;&nbsp;&nbsp; edx,dword ptr [eax+4]<br />25)&nbsp;56 00ce1092 mov&nbsp;&nbsp;&nbsp;&nbsp; ecx,esi<br />26)&nbsp;56 00ce1094 call&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">edx&nbsp;&nbsp; &gt;&gt;&gt;call pb1-&gt;Func2()</span><br />27)&nbsp;59 00ce1096 add&nbsp;&nbsp;&nbsp;&nbsp; esi,4<br />28)&nbsp;60 00ce1099 push&nbsp;&nbsp;&nbsp; esi<br />29)&nbsp;60 00ce109a push&nbsp;&nbsp;&nbsp; offset test!`string' (00cea164)<br />30)&nbsp;60 00ce109f call&nbsp;&nbsp;&nbsp; test!printf (00ce10e7)<br />31)&nbsp;61 00ce10a4 mov&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [esi]<br />32)&nbsp;61 00ce10a6 mov&nbsp;&nbsp;&nbsp;&nbsp; edx,dword ptr [eax]<br />33)&nbsp;61 00ce10a8 add&nbsp;&nbsp;&nbsp;&nbsp; esp,8<br />34)&nbsp;61 00ce10ab mov&nbsp;&nbsp;&nbsp;&nbsp; ecx,esi<br />35)&nbsp;61 00ce10ad call&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">edx&nbsp; &gt;&gt;&gt;call Func1's adjustor thunk</span><br />36)&nbsp;62 00ce10af mov&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [esi]<br />37)&nbsp;62 00ce10b1 mov&nbsp;&nbsp;&nbsp;&nbsp; edx,dword ptr [eax+4]<br />38)&nbsp;62 00ce10b4 mov&nbsp;&nbsp;&nbsp;&nbsp; ecx,esi<br />39)&nbsp;62 00ce10b6 call&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">edx&nbsp;&nbsp; &gt;&gt;&gt;call Func2's adjustor thunk<br /></span>40)&nbsp;63 00ce10b8 xor&nbsp;&nbsp;&nbsp;&nbsp; eax,eax<br />41)&nbsp;63 00ce10ba pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br />42)&nbsp;63 00ce10bb ret</p>
<p>If we run the code till line 12 above (object pObj1 is constructed successfully then, and eax register contains the this pointer of pObj1), then display the object of pObj1:</p>
<p>We can see it has two vtable pointers since it inherits two base classes, and both base classes have virtual functions:</p>
<p>0:000&gt; dt test!Derived @eax<br />&nbsp;&nbsp; +0x000 __VFN_table : <span style="background-color: #ffff00;">0x00cea194</span> <br />&nbsp;&nbsp; +0x004 __VFN_table : <span style="background-color: #ffff00;">0x00cea1a0</span> <br />&nbsp;&nbsp; +0x008 m1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 0n1<br />&nbsp;&nbsp; +0x00c m2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 0n2</p>
<p>Let&rsquo;s check the two vtables:</p>
<p>We can see the first vtable contains function pointers which points to the actual function implementation:<br />(Derived::`RTTI Complete Object Locator' is for Run Time Type Identification purpose):</p>
<p>0:000&gt; dps <span style="background-color: #ffff00;">0x00cea194</span> L3<br />00cea194&nbsp; 00ce1000 test!Derived::Func1<br />00cea198&nbsp; 00ce1020 test!Derived::Func2<br />00cea19c&nbsp; 00cea334 test!Derived::`RTTI Complete Object Locator'</p>
<p>And the other vtable contains function pointers to the adjust thunk function:</p>
<p><br />0:000&gt; dps <span style="background-color: #ffff00;">0x00cea1a0</span> L2<br />00cea1a0&nbsp; <span style="background-color: #ffff00;">00ce10c0</span> test![thunk]:Derived::Func1`adjustor{4}'<br />00cea1a4&nbsp; 00ce10d0 test![thunk]:Derived::Func2`adjustor{4}'</p>
<p>If we check the adjustor thunk function, we can see it just changes the ecx register, and then jumps to the actual function implementation. We know for the this call calling convention, ecx holds the this pointer, so it just adjusts the this pointer and then does a jump.</p>
<p>0:000&gt; u <span style="background-color: #ffff00;">00ce10c0</span> <br />test![thunk]:Derived::Func1`adjustor{4}':<br />00ce10c0 sub&nbsp;&nbsp;&nbsp;&nbsp; ecx,4<br />00ce10c3 jmp&nbsp;&nbsp;&nbsp;&nbsp; test!Derived::Func1 (00ce1000)</p>
<p>Now let&rsquo;s see how Derived::Func1 is called via one of its base class pointer pb1, we know esi holds the this pointer of pObj1:<br />&nbsp;<br />18)&nbsp;55 00ce1082 mov&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [esi] &gt;&gt;&gt;move vtable pointer (the first vtable pointer in object pObj1) to eax<br />19)&nbsp;55 00ce1084 mov&nbsp;&nbsp;&nbsp;&nbsp; edx,dword ptr [eax] &gt;&gt;&gt;move the first function pointer in the vtable to edx, which is Func1<br />20)&nbsp;<br />21)&nbsp;55 00ce1089 mov&nbsp;&nbsp;&nbsp;&nbsp; ecx,esi &gt;&gt;&gt;&gt;move esi to ecx, which adheres to the this call calling convention<br />22)&nbsp;55 00ce108b call&nbsp;&nbsp;&nbsp; edx&nbsp;&nbsp; &gt;&gt;&gt;call pb1-&gt;Func1()</p>
<p>This is a typical virtual function call sequence, since pb1 just points to the start of pObj1 in memory, so there is no need to do any adjust for the this pointer.</p>
<p>However, let&rsquo;s see how the same function is called via another base class pointer pb2:</p>
<p>27)&nbsp;59 00ce1096 add&nbsp;&nbsp;&nbsp;&nbsp; esi,4 &gt;&gt;&gt;&gt;add 4 to esi, so esi (pb2) points to the second vtable pointer in pObj1<br />28)&nbsp;&hellip;<br />29)&nbsp;&hellip;<br />30)&nbsp;&hellip;<br />31)&nbsp;61 00ce10a4 mov&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [esi]&nbsp; &gt;&gt;&gt;move the second vtable pointer to eax<br />32)&nbsp;61 00ce10a6 mov&nbsp;&nbsp;&nbsp;&nbsp; edx,dword ptr [eax] &gt;&gt;&gt;move the first function in the second vtable to edx<br />33)&nbsp;&hellip;.<br />34)&nbsp;61 00ce10ab mov&nbsp;&nbsp;&nbsp;&nbsp; ecx,esi &gt;&gt;&gt;move esi to ecx<br />35)&nbsp;61 00ce10ad call&nbsp;&nbsp;&nbsp; edx&nbsp; &gt;&gt;&gt;call Func1's adjustor thunk</p>
<p>We see that when we use pb2 to call Derived::Func1, pb2 actually points to the second vtable pointers (added 4 to esi, which is moved to ecx), since there is only one implementation of Func1, so before we calls into Func1, we need to adjust the ecx pointer (substract 4 from 4), thus we pass the correct this pointer to Func1 so it can address Derived&rsquo;s member in Func1 correctly, this is exactly what the adjust thunk function is doing (see the assembly we have shown above)</p>
<p>Below chart will make all these more clear:</p>
<p><img height="235" width="647" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/52/36/7737.adjustor_thunk.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-52-36/7737.adjustor_5F00_thunk.png" border="0" /></p>]]></content:encoded>
    </item>
    <item>
      <title>C++ tips: Why the pop method of STL stack does not return a value</title>
      <link>https://docs.microsoft.com/archive/blogs/zhanli/c-tips-why-the-pop-method-of-stl-stack-does-not-return-a-value</link>
      <pubDate>Mon, 28 Jun 2010 21:16:00 GMT</pubDate>
      <dc:creator><![CDATA[Zhan Li [MS]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/zhanli/2010/06/28/c-tips-why-the-pop-method-of-stl-stack-does-not-return-a-value/</guid>
      <description><![CDATA[Or why they don't combine the functionality of pop/top method into one function?
We know that the...]]></description>
      <content:encoded><![CDATA[<p>Or why they don't combine the functionality of pop/top method into one function?</p>
<p>We know that the pop method pops the top element of the stack, change the stack's internal state but returns nothing; and the top method returns a reference to the top element on the stack, but does not change the stack's internal state. If we want to pop the top element and then remove it from the stack, we need to call both top and pop:</p>
<p>&nbsp;</p>
<p>stack&lt;Gadget&gt; gadgets;</p>
<p>gadget = gadgets.top();</p>
<p>gadgets.pop();</p>
<p>&nbsp;</p>
<p>One of the reasons is exception safety, suppose we combine functionalities into one function:</p>
<p>template&lt;class T&gt;</p>
<p>class stack</p>
<p>{</p>
<p>public:</p>
<p>T pop();&nbsp;&nbsp;&nbsp; //let pop to change the stack's internal state and return the top element</p>
<p>};</p>
<p>&nbsp;</p>
<p>Then suppose the client write below code:</p>
<p>&nbsp;</p>
<p>Gadget gadget;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //call default constructor of Gadget</p>
<p>gadget = gadgets.pop();&nbsp; //call operator= of Gadget</p>
<p>&nbsp;</p>
<p>or</p>
<p>&nbsp;</p>
<p>Gadget gadget = gadgets.pop();&nbsp; //call copy constructor of Gadget</p>
<p>&nbsp;</p>
<p>If operator= or copy constructor throws exception, then we will be in trouble: the stack's internal state has been changed, but we have not get the popped element.</p>
<p>Actually, any mutator function (function that changes an object's internal state) should not directly return an object to avoid the issue discussed here.</p>]]></content:encoded>
    </item>
    <item>
      <title>C++ tips: why you should not leak exception from a destructor</title>
      <link>https://docs.microsoft.com/archive/blogs/zhanli/c-tips-why-you-should-not-leak-exception-from-a-destructor</link>
      <pubDate>Mon, 28 Jun 2010 02:38:26 GMT</pubDate>
      <dc:creator><![CDATA[Zhan Li [MS]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/zhanli/2010/06/28/c-tips-why-you-should-not-leak-exception-from-a-destructor/</guid>
      <description><![CDATA[One of the reasons: we know the destructor of an auto object can be called in two...]]></description>
      <content:encoded><![CDATA[<p>One of the reasons: we know the destructor of an auto object can be called in two situations:</p>
<p>&nbsp;1. When the object is out of scope normally.</p>
<p>&nbsp;2. During the stack unwind when handling an exception.</p>
<p>For situation 2, if the destructor throws another exceptions when it is handling the first exception, C++ will call terminate to kill your process.</p>
<p>Consider below code:</p>
<p style="padding-left: 60px;">#include "stdafx.h"</p>
<p style="padding-left: 60px;">&nbsp;class MyClass</p>
<p style="padding-left: 60px;">{</p>
<p style="padding-left: 60px;">public:</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~MyClass();</p>
<p style="padding-left: 60px;">};</p>
<p style="padding-left: 60px;">&nbsp;MyClass::~MyClass()</p>
<p style="padding-left: 60px;">{</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw 2;</p>
<p style="padding-left: 60px;">}</p>
<p style="padding-left: 60px;">&nbsp;int _tmain(int argc, _TCHAR* argv[])</p>
<p style="padding-left: 60px;">{</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&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;&nbsp;&nbsp;&nbsp; MyClass obj1;</p>
<p style="padding-left: 60px;">&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;&nbsp;&nbsp;&nbsp;&nbsp; //intentionally throws a exception here</p>
<p style="padding-left: 60px;">&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;&nbsp;&nbsp;&nbsp; throw 1;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(...)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&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;&nbsp;&nbsp;&nbsp; printf("never reachs here\r\n");</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;</p>
<p style="padding-left: 60px;">}</p>
<p>&nbsp;</p>
<p>When you run the debug build under VS 2010, you get below Debug Error window and you can see Terminate gets called:</p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/52/36/7220.dtor_terminate.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-52-36/7220.dtor_5F00_terminate.png" border="0" /></p>
<p>debug build call stack in VS 2010 (Parameters removed for clarify):</p>
<p>&nbsp;&nbsp;msvcr100d.dll!_NMSG_WRITE<br />&nbsp;&nbsp;msvcr100d.dll!abort<br />&nbsp;&nbsp;<span style="background-color: #ffff00;">msvcr100d.dll!terminate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;terminate gets called</span><br />&nbsp;&nbsp;msvcr100d.dll!__FrameUnwindFilter<br />&nbsp;&nbsp;msvcr100d.dll!__FrameUnwindToState<br />&nbsp;&nbsp;msvcr100d.dll!@_EH4_CallFilterFunc@8<br />&nbsp;&nbsp;ntdll.dll!ExecuteHandler2@20<br />&nbsp;&nbsp;ntdll.dll!ExecuteHandler@20<br />&nbsp;&nbsp;ntdll.dll!_KiUserExceptionDispatcher@8<br />&nbsp;&nbsp;KernelBase.dll!RaiseException<br /><span style="background-color: #ffff00;">&nbsp;&nbsp;msvcr100d.dll!_CxxThrowException&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; MyClass::~MyClass throws another exception</span><br />&nbsp;&nbsp;test.exe!MyClass::~MyClass<br />&nbsp;&nbsp;msvcr100d.dll!_CallSettingFrame<br />&nbsp;&nbsp;msvcr100d.dll!__FrameUnwindToState<br />&nbsp;&nbsp;msvcr100d.dll!CatchIt<br />&nbsp;&nbsp;msvcr100d.dll!FindHandler<br />&nbsp;&nbsp;msvcr100d.dll!__InternalCxxFrameHandler<br />&nbsp;&nbsp;msvcr100d.dll!__CxxFrameHandler3<br />&nbsp;&nbsp;ntdll.dll!ExecuteHandler2@20<br />&nbsp;&nbsp;ntdll.dll!ExecuteHandler@20<br />&nbsp;&nbsp;ntdll.dll!_KiUserExceptionDispatcher@8<br />&nbsp;&nbsp;KernelBase.dll!RaiseException<br />&nbsp;&nbsp;<span style="background-color: #ffff00;">msvcr100d.dll!_CxxThrowException&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;first exception</span> <br />&nbsp;&nbsp;test.exe!wmain<br />&nbsp;&nbsp;test.exe!__tmainCRTStartup<br />&nbsp;&nbsp;test.exe!wmainCRTStartup<br />&nbsp;&nbsp;kernel32.dll!BaseThreadInitThunk<br />&nbsp;&nbsp;ntdll.dll!__RtlUserThreadStart<br />&nbsp;&nbsp;ntdll.dll!_RtlUserThreadStart</p>
<p>When you run the release build on Windows 7, Windows Error Reporting gets involved:</p>
<p>0:000&gt; kL 50<br />ChildEBP RetAddr&nbsp; <br />0016ede4 003024b7 kernel32!UnhandledExceptionFilter<br />0016f120 0030747f test!_call_reportfault+0x107<br />0016f130 003052b2 test!abort+0x28<br /><span style="background-color: #ffff00;">0016f160 0016f6a0 test!terminate+0x33</span><br />WARNING: Frame IP not in any known module. Following frames may be wrong.<br />0016f164 003081ee 0x16f6a0<br />0016f16c 00304fe4 test!__FrameUnwindToState+0x86<br />0016f180 003026be test!_EH4_CallFilterFunc+0x12<br />0016f1ac 77d565f9 test!_except_handler4+0x8e<br />0016f1d0 77d565cb ntdll!ExecuteHandler2+0x26<br />0016f280 77d56457 ntdll!ExecuteHandler+0x24<br />0016f280 00000000 ntdll!KiUserExceptionDispatcher+0xf</p>]]></content:encoded>
    </item>
    <item>
      <title>Design pattern in .NET: template method</title>
      <link>https://docs.microsoft.com/archive/blogs/zhanli/design-pattern-in-net-template-method</link>
      <pubDate>Sat, 26 Jun 2010 02:42:00 GMT</pubDate>
      <dc:creator><![CDATA[Zhan Li [MS]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/zhanli/2010/06/26/design-pattern-in-net-template-method/</guid>
      <description><![CDATA[GoF's classical design pattern book has discussed template method pattern: define the skeleton of an...]]></description>
      <content:encoded><![CDATA[<p>GoF's classical design pattern book has discussed template method pattern: define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.</p>
<p>We see this pattern in .NET programming also:</p>
<p>1. The dispose pattern</p>
<p>Any type that wraps native resource needs to have a finalizer method to release the native resource. It is also recommended for this kind of types to implement the dispose pattern so the users can explicitly call the dispose method to release the native resource deterministically. This dispose pattern follows the template method pattern actually:</p>
<p>Sample code:</p>
<p style="padding-left: 60px;">using System;</p>
<p style="padding-left: 60px;">using System.Collections.Generic;</p>
<p style="padding-left: 60px;">using System.Linq;</p>
<p style="padding-left: 60px;">using System.Text;</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">namespace DesignPattern</p>
<p style="padding-left: 60px;">{</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; internal class MyNativeResourceWrapper: IDisposable</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //template method, which calls the actual implementation method to </p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //do the cleanup, the actual implementation method can be overrided </p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //by derived classes.</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Dispose()</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dispose(true);</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //actual implementation method to do the native resource cleanup</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //it is virtual and protected so the derived classes can override</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //if the class is sealed, this class should be private</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected virtual void Dispose(bool disposing)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(disposing)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //method is called by Dispose(), do the proper cleanup here</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //also call GC.SuppressFinaliz so GC will not call us again</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GC.SuppressFinalize(this);</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //method is called by GC, you should not reference </p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//other managed members here</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //since they may be garbage collected already&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~MyNativeResourceWrapper()</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dispose(false);</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; class MyDerivedNRW : MyNativeResourceWrapper</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override void Dispose(bool disposing)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Console.WriteLine("Derived Dispose");</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.Dispose(disposing);</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; class Program</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyNativeResourceWrapper obj1 = new MyNativeResourceWrapper();</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj1.Dispose();</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyNativeResourceWrapper obj2 = new MyDerivedNRW();</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj2.Dispose();</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">}</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p>2. The event pattern in .net can be treated as the template method pattern also.</p>
<p>&nbsp;</p>
<p>We know event is built on top of delegate, and delegate actually maintains a list of type safe function pointers. When we define an event, what the compiler actually does is to define a private delegate type, an add_XXX method to add object to the delegate and a remove_XXX method to remove object from the delegate. You can use tools such as reflector to check the code generated by the compiler.</p>
<p>&nbsp;</p>
<p>Sample code:</p>
<p>&nbsp;</p>
<p style="padding-left: 60px;">using System;</p>
<p style="padding-left: 60px;">using System.Collections.Generic;</p>
<p style="padding-left: 60px;">using System.Linq;</p>
<p style="padding-left: 60px;">using System.Text;</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">namespace DesignPattern</p>
<p style="padding-left: 60px;">{</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; internal class NewMailEventArgs : EventArgs</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string m_Subject;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;private readonly string m_From;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private readonly string m_To;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Subject { get { return m_Subject; } }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string From { get { return m_From; } }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string To { get { return m_To; } }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public NewMailEventArgs(string subject, string from, string to)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_Subject = subject;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_From = from;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_To = to;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; internal class MailMgr</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //1. define an event</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public event EventHandler&lt;NewMailEventArgs&gt; NewMail;</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //2. actual implementation method that raises the event</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // which calls into the actual method that client implements</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected virtual void OnNewMail(NewMailEventArgs e)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EventHandler&lt;NewMailEventArgs&gt; temp = NewMail;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (temp != null)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp(this, e);</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //3. template method to actually call implementation method</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void SimilateNewMailArrives(string subject)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NewMailEventArgs e = new NewMailEventArgs("hello","george","nick");</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnNewMail(e);</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; internal class MailClient</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public MailClient(MailMgr mailmgr)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailmgr.NewMail += HandleNewMail;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void HandleNewMail(object sender, NewMailEventArgs e)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("get new mail with subject: {0}", e.Subject);</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void UnRegister(MailMgr mailmgr)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailmgr.NewMail -= HandleNewMail;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; </p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; class Program</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MailMgr mgr = new MailMgr();</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MailClient client = new MailClient(mgr);</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mgr.SimilateNewMailArrives("hello");</p>
<p style="padding-left: 60px;">&nbsp;</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.UnRegister(mgr);</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-left: 60px;">}</p>]]></content:encoded>
    </item>
  </channel>
</rss>