<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Angel Hernández</title><subtitle type="html" /><id>http://msmvps.com/blogs/angelhernandez/atom.aspx</id><link rel="alternate" type="text/html" href="http://msmvps.com/blogs/angelhernandez/default.aspx" /><link rel="self" type="application/atom+xml" href="http://msmvps.com/blogs/angelhernandez/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.40407.4157">Community Server</generator><updated>2009-06-08T07:19:00Z</updated><entry><title>Assembler Language in .NET and some other ideas</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/11/16/assembler-language-in-net-and-some-other-ideas.aspx" /><id>/blogs/angelhernandez/archive/2009/11/16/assembler-language-in-net-and-some-other-ideas.aspx</id><published>2009-11-16T02:22:12Z</published><updated>2009-11-16T02:22:12Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hi Community,&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;This post is about something not very recent in .NET and it’s been available for a while, but the first time I read about it I couldn’t blog it because I didn’t have a blog back then &lt;img src="http://msmvps.com/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt; and since I’m currently reading this book once again &amp;quot;&lt;a href="http://www.amazon.com/Art-Assembly-Language-Randall-Hyde/dp/1886411972#noop"&gt;The art of assembly language&lt;/a&gt;&amp;quot; (I think that I’m reading it for the third time… It just contains too much information) so I thought it’s worthy to mention it. Even when .NET is&amp;#160; &lt;a href="http://en.wikipedia.org/wiki/Managed_code"&gt;managed code&lt;/a&gt;, in the end the CPU understands&amp;#160; &lt;a href="http://en.wikipedia.org/wiki/Machine_code"&gt;machine code &lt;/a&gt; which can be represented through&amp;#160; &lt;a href="http://en.wikipedia.org/wiki/Assembler_language"&gt;assembler language&lt;/a&gt;. This happens the same with the rest of other languages (managed and non-managed). Back in&amp;#160; 2001, someone had the brilliant idea of doing&amp;#160; &lt;a href="http://en.wikipedia.org/wiki/Asp.net"&gt;ASP.NET&lt;/a&gt; with&amp;#160; &lt;a href="http://en.wikipedia.org/wiki/Assembler_language"&gt;assembler language&lt;/a&gt;.&amp;#160; The article can be found&amp;#160; &lt;a href="http://www.viksoe.dk/code/asmil.htm"&gt;here&lt;/a&gt; and below a sample page is depicted &lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;img src="http://www.viksoe.dk/code/screenshots/asmil.gif" width="369" height="288" alt="" /&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;The few things I learned about &lt;a href="http://en.wikipedia.org/wiki/Assembler_language"&gt;assembler language&lt;/a&gt; was back in 1995, thanks to my mate Virginia when she was about to earn her degree in Bsc. Systems Engineering and I was a freshman in Uni. I used to spend a lot of time with &lt;a href="http://en.wikipedia.org/wiki/Visual_C%2B%2B"&gt;Microsoft C/C++ 7.0&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Microsoft_Foundation_Class_Library"&gt;MFC 1.0&lt;/a&gt; was bundled in it) and I thought it was cool to place inline code inside&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/45yd4tzz(VS.80).aspx"&gt;__asm&lt;/a&gt;, at the same time I was learning &lt;a href="http://en.wikipedia.org/wiki/Visual_Basic"&gt;VB 4.0&lt;/a&gt; and in my spare time I played&amp;#160; &lt;a href="http://en.wikipedia.org/wiki/Heretic_(video_game)"&gt;Heretic&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Mortal_Kombat_2"&gt;MK II&lt;/a&gt;... I remember my mom calling me to go and have lunch &lt;img src="http://msmvps.com/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt; *sigh* What a wonderful time!!!... There’s one thing I’ve been trying to keep from that time and throughout the years and it’s been like a golden rule: &lt;em&gt;&amp;quot;whatever you do, do it with passion and… there’s no a better way to learn something new than by playing with it”&lt;/em&gt;&amp;#160; and that’s probably why I never get bored of PCs, technology and related stuff. &lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Changing of topics, some days ago one of our customers had a new requirement &lt;em&gt;“I’d like to detect when an active session is about to expire and store the existing cart in &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Customer_relationship_management"&gt;&lt;em&gt;CRM&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;quot;, &lt;/em&gt;this is something very easy and straightforward to do in &lt;a href="http://en.wikipedia.org/wiki/Asp.net"&gt;ASP.NET&lt;/a&gt;, where I can put some code in the &lt;a href="http://en.wikipedia.org/wiki/Global.asax"&gt;Global.asax&lt;/a&gt; and intercept the &lt;a href="http://articles.techrepublic.com.com/5100-10878_11-5771721.html"&gt;Session_End&lt;/a&gt; event but what I’m talking about is a &lt;a href="http://en.wikipedia.org/wiki/Sharepoint"&gt;SharePoint&lt;/a&gt; based solution with &lt;a href="http://en.wikipedia.org/wiki/Form_based_authentication"&gt;form based authentication&lt;/a&gt; enabled and as we all MUST know by now, &lt;a href="http://en.wikipedia.org/wiki/Sharepoint"&gt;SharePoint&lt;/a&gt; supports this authentication scheme since&amp;#160; version 2007, because it has always relied on&amp;#160; &lt;a href="http://en.wikipedia.org/wiki/NTLM"&gt;NTLM&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Kerberos_(protocol)"&gt;Kerberos&lt;/a&gt;.&amp;#160; Anyways I had a couple of approaches which I mention below:&amp;#160; &lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Every single &lt;a href="http://en.wikipedia.org/wiki/Sharepoint"&gt;SharePoint&lt;/a&gt; application is an instance of &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.applicationruntime.sphttpapplication.aspx"&gt;SPHttpApplication&lt;/a&gt; which in turn inherits from &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx"&gt;HttpApplication&lt;/a&gt;, so I said&amp;#160; &amp;quot;Nah... this is a piece of cake&amp;quot;, I just need to modify the &lt;a href="http://en.wikipedia.org/wiki/Global.asax"&gt;Global.asax&lt;/a&gt; and write some inline code to handle &lt;a href="http://articles.techrepublic.com.com/5100-10878_11-5771721.html"&gt;Session_End&lt;/a&gt;&amp;#160; but it doesn’t work &lt;img src="http://msmvps.com/emoticons/emotion-6.gif" alt="Sad" /&gt; so I thought about creating a new project and explicit inherit from &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.applicationruntime.sphttpapplication.aspx"&gt;SPHttpApplication&lt;/a&gt; but it doesn’t work either…&amp;#160; So I gave it a try to another alternative…&lt;/span&gt;&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Write an &lt;a href="http://msdn.microsoft.com/en-us/library/zec9k340(VS.71).aspx"&gt;HttpModule&lt;/a&gt; which contains a &lt;a href="http://en.wikipedia.org/wiki/Singleton_pattern"&gt;singleton&lt;/a&gt; and at the same time it keeps a data structure updated and in sync by a&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx"&gt;critical section&lt;/a&gt; at the moment of a session timing out, code is shown below &lt;/span&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;       &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;         &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;           &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.ComponentModel;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Web;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.SharePoint;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.SharePoint.ApplicationRuntime;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.SharePoint.Security;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Web.SessionState;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Demo {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; MyCustomApplication : IHttpModule {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#cc6633;"&gt;#region&lt;/span&gt; IHttpModule Members&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; SyncedInfo _synced = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; GCHandle? _allocatedMem = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; GCHandle? AllocatedMemory {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            get {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _allocatedMem;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            set {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                _allocatedMem = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; SyncedInfo Singleton {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            get {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _synced;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            set {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                _synced = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Dispose() {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (AllocatedMemory != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                AllocatedMemory.Value.Free();&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Init(HttpApplication context) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (Singleton == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                Singleton = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SyncedInfo(context.Modules[&lt;span style="color:#006080;"&gt;&amp;quot;Session&amp;quot;&lt;/span&gt;]);&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                AllocatedMemory = GCHandle.Alloc(Singleton);&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#cc6633;"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    [Serializable]&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; SyncedInfo {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; SessionStateModule _sessionModule;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; HttpContext _currentContext = HttpContext.Current;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; SyncedInfo(IHttpModule context) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            _sessionModule = (SessionStateModule)context;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            _currentContext.Application[&lt;span style="color:#006080;"&gt;&amp;quot;UserData&amp;quot;&lt;/span&gt;] = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            _sessionModule.Start += Session_Start;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            _sessionModule.End += Session_End;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Push(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; customer, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; selectedData) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; retval = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; userData = _currentContext.Application[&lt;span style="color:#006080;"&gt;&amp;quot;UserData&amp;quot;&lt;/span&gt;];&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;lock&lt;/span&gt; (userData) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData).ContainsKey(customer)) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        ((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData).Add(customer, selectedData);&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    } &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt; {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        ((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData)[customer] = selectedData;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    retval = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            } &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; { } &lt;span style="color:#008000;"&gt;// Swallow the exception&lt;/span&gt;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; KeyValuePair&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;? Pop(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; customer) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            KeyValuePair&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;? retval = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; userData = _currentContext.Application[&lt;span style="color:#006080;"&gt;&amp;quot;UserData&amp;quot;&lt;/span&gt;];&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;lock&lt;/span&gt; (userData) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData).ContainsKey(customer)) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        retval = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; KeyValuePair&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;(customer, ((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData)[customer]);&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        ((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData).Remove(customer);&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            } &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; { retval = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;; } &lt;span style="color:#008000;"&gt;// Swallow the exception&lt;/span&gt;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Session_End(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#008000;"&gt;// Serialize data here (Pop)&lt;/span&gt;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            SPSecurity.RunWithElevatedPrivileges(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SPSecurity.CodeToRunElevated(&lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;() {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                WriteActivity(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            }));&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Session_Start(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#008000;"&gt;// Push should be call from the App (UI)&lt;/span&gt;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            SPSecurity.RunWithElevatedPrivileges(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SPSecurity.CodeToRunElevated(&lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;() {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                WriteActivity(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            }));&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; WriteActivity(&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; state) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; fileName = &lt;span style="color:#006080;"&gt;@&amp;quot;c:\log.txt&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (StreamWriter logWriter = (!File.Exists(fileName) ? File.CreateText(fileName) : File.AppendText(fileName))) {&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    logWriter.WriteLine(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;Session {0} at {1}&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] { (state ? &lt;span style="color:#006080;"&gt;&amp;quot;Started&amp;quot;&lt;/span&gt; : &lt;span style="color:#006080;"&gt;&amp;quot;Ended&amp;quot;&lt;/span&gt;), DateTime.Now }));&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    logWriter.Flush();&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    logWriter.Close();&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            } &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; { } &lt;span style="color:#008000;"&gt;// Swallow exception&lt;/span&gt;&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


          &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;This approach should work, it does as a matter of fact, when &lt;a href="http://articles.techrepublic.com.com/5100-10878_11-5771721.html"&gt;Session_Start&lt;/a&gt; is triggered but it doesn’t fire when the session expires and in my humble opinion this is quite annoying because&amp;#160; &lt;a href="http://en.wikipedia.org/wiki/Sharepoint"&gt;SharePoint&lt;/a&gt; is taking away from me something that &lt;a href="http://en.wikipedia.org/wiki/Asp.net"&gt;ASP.NET&lt;/a&gt; provides, this is valid when security relies on Windows and “a valid ticket” is always available, but what about form based authentication? &lt;/span&gt;&lt;/p&gt;

&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;In conclusion, I can do ASP.NET with assembler language (according to the previously mentioned &lt;a href="http://www.viksoe.dk/code/asmil.htm"&gt;article&lt;/a&gt;) but I can’t intercept any event related to a&amp;#160; session timing out in SharePoint &lt;img src="http://msmvps.com/emoticons/emotion-6.gif" alt="Sad" /&gt;&amp;#160; How cool is that!!!!&lt;/span&gt;&lt;/p&gt;

&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;

&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1739920" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Lenguaje Ensamblador en .NET y algunas otras ideas</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/11/13/lenguaje-ensamblador-en-net-y-otras-ideas.aspx" /><id>/blogs/angelhernandez/archive/2009/11/13/lenguaje-ensamblador-en-net-y-otras-ideas.aspx</id><published>2009-11-13T05:53:00Z</published><updated>2009-11-13T05:53:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hola Comunidad,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;El siguiente post es sobre algo no tan nuevo en .NET que le&amp;iacute; hace un tiempo atr&amp;aacute;s, pero para ese entonces no ten&amp;iacute;a blog &lt;img src="http://msmvps.com/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt; y como actualmente estoy leyendo de nuevo este libro &amp;quot;&lt;a href="http://www.amazon.com/Art-Assembly-Language-Randall-Hyde/dp/1886411972#noop"&gt;El arte del lenguaje ensamblador&lt;/a&gt;&amp;quot; (creo que por tercera vez, porque contiene demasiada informaci&amp;oacute;n) pens&amp;eacute; que ser&amp;iacute;a interesante mencionarlo. Aunque .NET es &lt;a href="http://en.wikipedia.org/wiki/Managed_code"&gt;c&amp;oacute;digo gestionado&lt;/a&gt; al final de cuentas lo que entiende el procesador es &lt;a href="http://en.wikipedia.org/wiki/Machine_code"&gt;lenguaje de m&amp;aacute;quina&lt;/a&gt; que puede representarse simb&amp;oacute;licamente a traves del &lt;a href="http://en.wikipedia.org/wiki/Assembler_language"&gt;lenguaje Ensamblador&lt;/a&gt;, lo mismo pasa con los dem&amp;aacute;s lenguajes (gestionados y no gestionados). En el a&amp;ntilde;o 2001 ha alguien se le ocurri&amp;oacute; la idea de hacer &lt;a href="http://en.wikipedia.org/wiki/Asp.net"&gt;ASP.NET&lt;/a&gt; usando &lt;a href="http://en.wikipedia.org/wiki/Assembler_language"&gt;lenguaje ensamblador&lt;/a&gt;.&amp;nbsp; El art&amp;iacute;culo completo lo pueden ver &lt;a href="http://www.viksoe.dk/code/asmil.htm"&gt;ac&amp;aacute;&lt;/a&gt; y abajo pueden ver un ejemplo de como luce el c&amp;oacute;digo de la p&amp;aacute;gina&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;img height="288" width="369" src="http://www.viksoe.dk/code/screenshots/asmil.gif" alt="" /&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Lo poco que aprend&amp;iacute; sobre lenguaje &lt;a href="http://en.wikipedia.org/wiki/Assembler_language"&gt;Ensamblador&lt;/a&gt; fue por all&amp;aacute; en el a&amp;ntilde;o 1995, gracias a mi amiga Virginia que ya estaba por graduarse de Ingeniero de Sistemas y yo estaba reci&amp;eacute;n entrando en universidad. Me la pasaba horas haciendo cosas con &lt;a href="http://en.wikipedia.org/wiki/Visual_C%2B%2B"&gt;Microsoft C/C++ 7.0&lt;/a&gt; (que tra&amp;iacute;a consigo &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Foundation_Class_Library"&gt;MFC 1.0&lt;/a&gt;) por lo que me parec&amp;iacute;a ch&amp;eacute;vere poner c&amp;oacute;digo inline dentro del &lt;a href="http://msdn.microsoft.com/en-us/library/45yd4tzz(VS.80).aspx"&gt;__asm &lt;/a&gt;al mismo tiempo estaba aprendiendo&lt;a href="http://en.wikipedia.org/wiki/Visual_Basic"&gt; VB 4.0&lt;/a&gt; y en los ratos libres jugando &lt;a href="http://en.wikipedia.org/wiki/Heretic_(video_game)"&gt;Heretic&lt;/a&gt; y &lt;a href="http://en.wikipedia.org/wiki/Mortal_Kombat_2"&gt;MK II&lt;/a&gt;... Mientras mi mam&amp;aacute; me peleaba para que fuera a comer &lt;img src="http://msmvps.com/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt; que buenos tiempos aquellos... de verdad que si... Una cosa que he tratado mantener con los a&amp;ntilde;os es eso de &amp;quot;&lt;em&gt;hacer las cosas con pasi&amp;oacute;n y aprender jugando&lt;/em&gt;&amp;quot; por eso creo que no me aburro de la computadora. &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Cambiando de tema, en d&amp;iacute;as pasados un cliente hizo un requerimiento, &lt;em&gt;&amp;quot;quiero detectar cuando la sesi&amp;oacute;n haya expirado y guardar el carrito de compras en &lt;a href="http://en.wikipedia.org/wiki/Customer_relationship_management"&gt;CRM&lt;/a&gt;&amp;quot;&lt;/em&gt;, claro... en &lt;a href="http://en.wikipedia.org/wiki/Asp.net"&gt;ASP.NET&lt;/a&gt; puedo escribir algo en el &lt;a href="http://en.wikipedia.org/wiki/Global.asax"&gt;Global.asax&lt;/a&gt; e interceptar el evento &lt;a href="http://articles.techrepublic.com.com/5100-10878_11-5771721.html"&gt;Session_End&lt;/a&gt; y es sencillo, pero esto es una soluci&amp;oacute;n basada en &lt;a href="http://en.wikipedia.org/wiki/Sharepoint"&gt;SharePoint&lt;/a&gt; que hace uso de &lt;a href="http://en.wikipedia.org/wiki/Form_based_authentication"&gt;autenticaci&amp;oacute;n basada en formas&lt;/a&gt; y como es bien sabido &lt;a href="http://en.wikipedia.org/wiki/Sharepoint"&gt;SharePoint&lt;/a&gt; viene a soportar este tipo de autenticaci&amp;oacute;n&amp;nbsp; a partir de la versi&amp;oacute;n 2007, porque siempre ha utilizado &lt;a href="http://en.wikipedia.org/wiki/NTLM"&gt;NTLM&lt;/a&gt; y &lt;a href="http://en.wikipedia.org/wiki/Kerberos_(protocol)"&gt;Kerberos&lt;/a&gt; para ello. En fin, se me ocurrieron un par de ideas las cuales menciono a continuaci&amp;oacute;n:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Toda aplicaci&amp;oacute;n basada en &lt;a href="http://en.wikipedia.org/wiki/Sharepoint"&gt;SharePoint&lt;/a&gt; es una instancia de &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.applicationruntime.sphttpapplication.aspx"&gt;SPHttpApplication&lt;/a&gt; que a la vez deriva de &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx"&gt;HttpApplication&lt;/a&gt;, al estar consciente de esto me dije &amp;quot;Nah... sencillo&amp;quot; con modificar el &lt;a href="http://en.wikipedia.org/wiki/Global.asax"&gt;Global.asax&lt;/a&gt; y escribir c&amp;oacute;digo para el evento &lt;a href="http://articles.techrepublic.com.com/5100-10878_11-5771721.html"&gt;Session_End&lt;/a&gt; lo consigo... No funciona &lt;img src="http://msmvps.com/emoticons/emotion-6.gif" alt="Sad" /&gt; entonces pens&amp;eacute; en crear un proyecto y explicitamente derivar de &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.applicationruntime.sphttpapplication.aspx"&gt;SPHttpApplication&lt;/a&gt;&amp;nbsp; y tampoco funciona... Por lo que pens&amp;eacute; en otra alternativa...&lt;/span&gt; &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Crear un &lt;a href="http://msdn.microsoft.com/en-us/library/zec9k340(VS.71).aspx"&gt;HttpModule&lt;/a&gt; que contiene un &lt;a href="http://en.wikipedia.org/wiki/Singleton_pattern"&gt;singleton&lt;/a&gt; y este a su vez mantiene una estructura que mediante una &lt;a href="http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx"&gt;regi&amp;oacute;n cr&amp;iacute;tica&lt;/a&gt; permite su actualizaci&amp;oacute;n al &amp;ldquo;expirar alguna sesi&amp;oacute;n&amp;rdquo;, el c&amp;oacute;digo es mostrado a continuaci&amp;oacute;n&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;div align="justify"&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.ComponentModel;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Web;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.SharePoint;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.SharePoint.ApplicationRuntime;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.SharePoint.Security;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Web.SessionState;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Demo {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; MyCustomApplication : IHttpModule {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#cc6633;"&gt;#region&lt;/span&gt; IHttpModule Members&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; SyncedInfo _synced = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; GCHandle? _allocatedMem = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; GCHandle? AllocatedMemory {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            get {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _allocatedMem;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            set {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                _allocatedMem = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; SyncedInfo Singleton {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            get {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _synced;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            set {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                _synced = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Dispose() {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (AllocatedMemory != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                AllocatedMemory.Value.Free();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Init(HttpApplication context) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (Singleton == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                Singleton = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SyncedInfo(context.Modules[&lt;span style="color:#006080;"&gt;&amp;quot;Session&amp;quot;&lt;/span&gt;]);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                AllocatedMemory = GCHandle.Alloc(Singleton);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#cc6633;"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    [Serializable]&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; SyncedInfo {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; SessionStateModule _sessionModule;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; HttpContext _currentContext = HttpContext.Current;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; SyncedInfo(IHttpModule context) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            _sessionModule = (SessionStateModule)context;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            _currentContext.Application[&lt;span style="color:#006080;"&gt;&amp;quot;UserData&amp;quot;&lt;/span&gt;] = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            _sessionModule.Start += Session_Start;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            _sessionModule.End += Session_End;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Push(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; customer, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; selectedData) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; retval = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; userData = _currentContext.Application[&lt;span style="color:#006080;"&gt;&amp;quot;UserData&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;lock&lt;/span&gt; (userData) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData).ContainsKey(customer)) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        ((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData).Add(customer, selectedData);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    } &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt; {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        ((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData)[customer] = selectedData;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    retval = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            } &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; { } &lt;span style="color:#008000;"&gt;// Swallow the exception&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; KeyValuePair&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;? Pop(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; customer) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            KeyValuePair&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;? retval = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; userData = _currentContext.Application[&lt;span style="color:#006080;"&gt;&amp;quot;UserData&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;lock&lt;/span&gt; (userData) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData).ContainsKey(customer)) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        retval = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; KeyValuePair&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;(customer, ((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData)[customer]);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        ((Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;)userData).Remove(customer);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            } &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; { retval = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;; } &lt;span style="color:#008000;"&gt;// Swallow the exception&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Session_End(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#008000;"&gt;// Serialize data here (Pop)&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            SPSecurity.RunWithElevatedPrivileges(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SPSecurity.CodeToRunElevated(&lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;() {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                WriteActivity(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            }));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Session_Start(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#008000;"&gt;// Push should be call from the App (UI)&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            SPSecurity.RunWithElevatedPrivileges(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SPSecurity.CodeToRunElevated(&lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;() {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                WriteActivity(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            }));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; WriteActivity(&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; state) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; fileName = &lt;span style="color:#006080;"&gt;@&amp;quot;c:\log.txt&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (StreamWriter logWriter = (!File.Exists(fileName) ? File.CreateText(fileName) : File.AppendText(fileName))) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    logWriter.WriteLine(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;Session {0} at {1}&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] { (state ? &lt;span style="color:#006080;"&gt;&amp;quot;Started&amp;quot;&lt;/span&gt; : &lt;span style="color:#006080;"&gt;&amp;quot;Ended&amp;quot;&lt;/span&gt;), DateTime.Now }));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    logWriter.Flush();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    logWriter.Close();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            } &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; { } &lt;span style="color:#008000;"&gt;// Swallow exception&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Esta soluci&amp;oacute;n deber&amp;iacute;a funcionar, de hecho lo hace cuando &lt;a href="http://articles.techrepublic.com.com/5100-10878_11-5771721.html"&gt;Session_Start&lt;/a&gt; es disparado pero no cuando la sesi&amp;oacute;n expira lo cual me molesta pues &lt;a href="http://en.wikipedia.org/wiki/Sharepoint"&gt;SharePoint&lt;/a&gt; me est&amp;aacute; quitando algo ofrece &lt;a href="http://en.wikipedia.org/wiki/Asp.net"&gt;ASP.NET&lt;/a&gt;,&amp;nbsp; quiz&amp;aacute;s esto no aplica cuando la seguridad est&amp;aacute; basada en Windows pero puede darse el caso con autenticaci&amp;oacute;n basada en formas s&amp;iacute;.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Entonces es posible hacer ASP.NET con lenguaje Ensamblador (seg&amp;uacute;n el &lt;a href="http://www.viksoe.dk/code/asmil.htm"&gt;art&amp;iacute;culo&lt;/a&gt; antes mencionado) pero no puedo interceptar el cierre de una sesi&amp;oacute;n en SharePoint &lt;img src="http://msmvps.com/emoticons/emotion-6.gif" alt="Sad" /&gt;&amp;nbsp; Que les parece!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1739408" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Upcoming MSDN Webcast: A lap around Microsoft ASP.NET 4.0 and Microsoft Visual Studio 2010 / Próximo Webcast en MSDN: Una vuelta por Microsoft ASP.NET 4.0 y Microsoft Visual Studio 2010  </title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/11/05/upcoming-msdn-webcast-a-lap-around-microsoft-asp-net-4-0-and-microsoft-visual-studio-2010-pr-243-ximo-webcast-en-msdn-una-vuelta-por-microsoft-asp-net-4-0-y-microsoft-visual-studio-2010.aspx" /><id>/blogs/angelhernandez/archive/2009/11/05/upcoming-msdn-webcast-a-lap-around-microsoft-asp-net-4-0-and-microsoft-visual-studio-2010-pr-243-ximo-webcast-en-msdn-una-vuelta-por-microsoft-asp-net-4-0-y-microsoft-visual-studio-2010.aspx</id><published>2009-11-05T05:51:00Z</published><updated>2009-11-05T05:51:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hi Community,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;I&amp;#39;ll be presenting the following MSDN Webcast (Saturday, 28th November 2009 @ 7:00 AM - Australia Time)&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032426138&amp;amp;EventCategory=4&amp;amp;culture=es-AR&amp;amp;CountryCode=AR"&gt;A lap around Microsoft ASP.NET and Microsoft Visual Studio 2010&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;I look forward to seeing you there &lt;img src="http://msmvps.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt; 
&lt;hr /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hola Comunidad,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Estar&amp;eacute; presentando el siguiente MSDN Webcast (Viernes, 27 de Noviembre de 2009 (05:00 p.m. - Hora Colombia) - (05:30 p.m. - Hora Venezuela))&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032426138&amp;amp;EventCategory=4&amp;amp;culture=es-AR&amp;amp;CountryCode=AR"&gt;Una vuelta por Microsoft ASP.NET 4.0 y Microsoft Visual Studio 2010&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;Espero verlos ese d&amp;iacute;a &lt;img src="http://msmvps.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1737745" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Visual Studio Documentary / Documental de Visual Studio</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/10/06/visual-studio-documentary-documental-de-visual-studio.aspx" /><id>/blogs/angelhernandez/archive/2009/10/06/visual-studio-documentary-documental-de-visual-studio.aspx</id><published>2009-10-05T20:42:00Z</published><updated>2009-10-05T20:42:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hi Community,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Grabbed from &lt;a href="http://channel9.msdn.com"&gt;Channel 9&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hola Comunidad,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Tomado de &amp;nbsp;&lt;a href="http://channel9.msdn.com"&gt;Channel 9&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;
&lt;p&gt;
&lt;hr /&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="text-decoration:underline;"&gt;Part I&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;(Please visit the site to view this media)&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="text-decoration:underline;"&gt;Part II&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;(Please visit the site to view this media)&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1730008" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Angel on dnrTV / Angel en dnrTV (dotNet Rocks TV)</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/10/06/angel-on-dnrtv-angel-en-dnrtv-dotnet-rocks-tv.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="421691" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.73.00.06/DnRTV.zip" /><id>/blogs/angelhernandez/archive/2009/10/06/angel-on-dnrtv-angel-en-dnrtv-dotnet-rocks-tv.aspx</id><published>2009-10-05T20:05:00Z</published><updated>2009-10-05T20:05:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hi Community,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;I just finished my presentation on &lt;a href="http://www.dnrtv.com/default.aspx?showNum=154"&gt;dnrTV&lt;/a&gt;, thanks to &lt;a href="http://franklins.net/"&gt;Carl Franklin&lt;/a&gt; and &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt;.&amp;nbsp;This session was about &lt;strong&gt;&lt;em&gt;&amp;quot;Using Native Code in .NET&amp;quot;&lt;/em&gt;&lt;/strong&gt;&amp;nbsp;and we covered&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hooks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Memory Mapped Files&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;However, I&amp;#39;m planning to organize some other sessions to cover a bit more about this topic (e.g.: Virtual Memory, Device I/O, Error Reporting and Application Recovery and more). I&amp;#39;ll keep you updated on this.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Please, feel free to download the source code attached to this post&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hola&amp;nbsp;Comunidad,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Acabo de terminar mi presentaci&amp;oacute;n para&amp;nbsp; &lt;a href="http://www.dnrtv.com/default.aspx?showNum=154"&gt;dnrTV&lt;/a&gt;,&amp;nbsp;gracias a &amp;nbsp;&lt;a href="http://franklins.net/"&gt;Carl Franklin&lt;/a&gt;&amp;nbsp;y &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt;.&amp;nbsp;El t&amp;oacute;pico de esta sesi&amp;oacute;n fue&amp;nbsp; &lt;strong&gt;&lt;em&gt;&amp;quot;Using Native Code in .NET&amp;quot;&lt;/em&gt;&lt;/strong&gt;&amp;nbsp;y cubrimos&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hooks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Memory Mapped Files&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Sin embargo, estoy planeando organizar otras sesiones para&amp;nbsp;hablar un poco m&amp;aacute;s de este tema&amp;nbsp; (por ejemplo,&amp;nbsp;Virtual Memory, Device I/O, Error Reporting and Application Recovery and more). Los mantendr&amp;eacute; informados al respecto.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Por favor, si&amp;eacute;ntanse libres de descargar el c&amp;oacute;digo adjunto a este post&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1730006" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>WWSAPI (Windows Web Services API) + Interop + WPF… How cool is that!!!</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/09/28/wwsapi-windows-web-services-api-interop-wpf-cool.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="1181080" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.72.78.83/WWSAPI.zip" /><id>/blogs/angelhernandez/archive/2009/09/28/wwsapi-windows-web-services-api-interop-wpf-cool.aspx</id><published>2009-09-28T12:59:00Z</published><updated>2009-09-28T12:59:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;A couple of nights ago I was reading about some of the new features in Windows 7 SDK and I can honestly say &lt;strong&gt;&lt;em&gt;&amp;ldquo;They&amp;rsquo;re a lot&amp;rdquo;&lt;/em&gt;&lt;/strong&gt;, as a matter of fact, I mentioned some of them in one of my previous &lt;a href="http://msmvps.com/blogs/angelhernandez/archive/2009/09/10/slide-deck-and-demo-for-quot-blue-theater-quot-session-and-tech-talk-l-225-minas-y-demo-utilizados-para-mi-sesi-243-n-en-quot-blue-theater-quot-y-tech-talk.aspx"&gt;Tech-Ed&lt;/a&gt; session this year. Despite of all these new features, there&amp;rsquo;s one that got my attention from the beginning and it was WWSAPI, because there wasn&amp;rsquo;t any support for Web Service from native code, except for a couple of existing toolkits including &lt;a href="http://www.cs.fsu.edu/~engelen/soap.html"&gt;gSOAP&lt;/a&gt; that can be implemented&amp;nbsp; on Windows, Linux and Mac OSX.&amp;nbsp; WWSAPI was first introduced at&amp;nbsp; &lt;a href="http://microsoftpdc.com/"&gt;PDC&lt;/a&gt; 2008 and it will be formally released along Windows 7, although previous versions of the operating system starting from XP SP2 can get it via Windows Update when becomes available. I first tested it when Windows 7 was still RC but I didn&amp;rsquo;t post about it because I was expecting for Windows 7 to be released or about to be released. &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Having said that, last weekend I created a solution to demo&amp;nbsp; WWSAPI in conjunction with .NET. The solution structure is depicted below &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6787.Solution_5F00_31DA0632.png"&gt;&lt;img height="142" width="244" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/5466.Solution_5F00_thumb_5F00_16C13724.png" alt="Solution" border="0" title="Solution" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;NativeTester:&lt;/em&gt;&lt;/strong&gt; Console application (C++) which calls our Dynamic Link Library (DLL) &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;RSSFeedService&lt;/em&gt;&lt;/strong&gt;: Web Service (C#) which retrieves RSS feeds, parse them and returns a well-formed XML &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;RSSViewer&lt;/em&gt;&lt;/strong&gt;: WPF application (C#) which consumes the Web Service plus invokes our Dynamic Link Library (DLL)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;Tester:&lt;/em&gt;&lt;/strong&gt; WinForm application (C#) which consumes the Web Service plus invokes our Dynamic Link Library (DLL) &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;WWSAPIDemo:&lt;/em&gt;&lt;/strong&gt; Dynamic Link Library (C++) which implements&amp;nbsp; WWSAPI and it&amp;rsquo;s invoked from .NET via Interop &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Along with the code you can find MSDN.xml which contains the RSS feeds from &lt;a href="http://blogs.msdn.com/ausdev/rss.xml"&gt;MSDN Australia&lt;/a&gt;, even when the code references&amp;nbsp; &lt;a href="http://localhost/MSDN.xml" title="http://localhost/MSDN.xml"&gt;http://localhost/MSDN.xml&lt;/a&gt;, you can change the Url and retrieve any given RSS, in my case I deployed the previously mentioned file to my local &lt;a href="http://en.wikipedia.org/wiki/Internet_Information_Services"&gt;IIS&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Many of you might be wondering about, how can I generate a proxy based on the Web Service via C++?&amp;nbsp; and the answer is quite simple, the new Windows 7 &lt;a href="http://msdn.microsoft.com/en-us/windows/bb980924.aspx"&gt;SDK&lt;/a&gt; provides us with an utility that does this for us, &lt;a href="http://msdn.microsoft.com/en-us/library/dd430644(VS.85).aspx"&gt;WSUTIL.exe&lt;/a&gt;. After executing it, we have as a result two files (an .H and a .CPP). The strings are treated as&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/ms684497(EXCHG.10).aspx"&gt;WCHAR&lt;/a&gt;* by default which in turn is &lt;a href="http://en.wikipedia.org/wiki/Unicode"&gt;Unicode&lt;/a&gt; and every single string in .NET are &lt;a href="http://en.wikipedia.org/wiki/Unicode"&gt;Unicode&lt;/a&gt; as well, I&amp;rsquo;ll comment a bit more about this later.&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/7345.wsutil_5F00_7893796F.png"&gt;&lt;img height="102" width="622" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/2555.wsutil_5F00_thumb_5F00_09D368E1.png" alt="wsutil" border="0" title="wsutil" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Having the Web Service published already on IIS, we better start working on the Dynamic Link Library which implements WWSAPI. Below we can see its header file &lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#cc6633;"&gt;#include&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;stdafx.h&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#cc6633;"&gt;#define&lt;/span&gt; EXPORT &lt;span style="color:#0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; __declspec(dllexport)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#cc6633;"&gt;#define&lt;/span&gt; MAX_SIZE  128000 &lt;span style="color:#008000;"&gt;//128Kb&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#cc6633;"&gt;#define&lt;/span&gt; TRIM_SIZE 512&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;EXPORT WCHAR* GetFeeds(WCHAR* szUrl, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; cbResults);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;EXPORT &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; GetItem(WCHAR* szUrl, WCHAR* szItemName);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;And this is the method responsible for connecting against the Web Service and retrieves the RSS feeds &lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;// Get feeds from a given Url through WWSAPI&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;EXPORT WCHAR* GetFeeds(WCHAR* szUrl, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; cbResults) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR* temp = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_HEAP* heap = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR retval[MAX_SIZE]; &lt;span style="color:#008000;"&gt;// 128Kb (It should be enough to avoid WS_E_QUOTA_EXCEEDED error)&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_ERROR* error = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    ULONG propertiesCount = 0;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_SERVICE_PROXY* proxy = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_CHANNEL_PROPERTY channelProps[2]; &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_STRING serviceUrl = WS_STRING_VALUE(L&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/DemoSvc/RSSFeedService.asmx&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_ENDPOINT_ADDRESS endpoint = { serviceUrl}; &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_ENVELOPE_VERSION soapVersion = WS_ENVELOPE_VERSION_SOAP_1_1; &lt;span style="color:#008000;"&gt;// Our Webservice is WsiProfiles.BasicProfile1_1 compliant&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_ADDRESSING_VERSION addressingVersion = WS_ADDRESSING_VERSION_TRANSPORT;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;// Set channel&amp;#39;s properties&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].id = WS_CHANNEL_PROPERTY_ENVELOPE_VERSION;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].value = &amp;amp;soapVersion;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].valueSize = &lt;span style="color:#0000ff;"&gt;sizeof&lt;/span&gt;(soapVersion);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    propertiesCount++;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;// Set addressing&amp;#39;s properties&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].id = WS_CHANNEL_PROPERTY_ADDRESSING_VERSION;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].value = &amp;amp;addressingVersion;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].valueSize = &lt;span style="color:#0000ff;"&gt;sizeof&lt;/span&gt;(addressingVersion);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    propertiesCount++;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;// Can we create an WsError and WsHeap objects?&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (SUCCEEDED(WsCreateError(NULL, NULL, &amp;amp;error)) &amp;amp;&amp;amp; SUCCEEDED(WsCreateHeap(MAX_SIZE, TRIM_SIZE, NULL, NULL, &amp;amp;heap, error))) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#008000;"&gt;// Can we create a proxy based on the service?&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;  (SUCCEEDED(WsCreateServiceProxy(WS_CHANNEL_TYPE_REQUEST, WS_HTTP_CHANNEL_BINDING, NULL, NULL, NULL, &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            channelProps, propertiesCount, &amp;amp;proxy, error))) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#008000;"&gt;// Can we open the proxy object?&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;  (SUCCEEDED(WsOpenServiceProxy(proxy, &amp;amp;endpoint, NULL, error))) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    &lt;span style="color:#008000;"&gt;// If we&amp;#39;re able to invoke the service then copy the results to another variable because if&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    &lt;span style="color:#008000;"&gt;// we don&amp;#39;t we lose the response after freeing the heap&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (SUCCEEDED(RSSFeedServiceSoap12_RetrieveFeeds(proxy, szUrl, cbResults, &amp;amp;temp, heap, NULL, NULL, NULL, error))) &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        wcscpy_s(retval, temp);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;// Deallocate and free resources&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (error != NULL)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        WsFreeError(error);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (proxy != NULL) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        WsCloseServiceProxy(proxy, NULL, error);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        WsFreeServiceProxy(proxy);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (heap != NULL)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        WsFreeHeap(heap);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Please note the following: &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;We must specify the version of &lt;a href="http://en.wikipedia.org/wiki/SOAP"&gt;SOAP&lt;/a&gt; to use (otherwise, the client is going to complain about it, because it will use 1.2, as evidence check the &lt;strong&gt;&lt;em&gt;RSSFeedServiceSoap12 &lt;/em&gt;&lt;/strong&gt;method name)&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;I return a WCHAR* and it works without issues, even when the right way to do it is returning an &lt;a href="http://en.wikipedia.org/wiki/HRESULT"&gt;HRESULT&lt;/a&gt; or an integer, accept a pointer as an argument which at the same time it&amp;rsquo;s an output parameter. There&amp;rsquo;s a document about best practices for creating DLLs which can be downloaded from &lt;a href="http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx"&gt;here&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Our implementation from the console application is shown below &lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#cc6633;"&gt;#include&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;stdafx.h&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;typedef&lt;/span&gt; WCHAR* (*myCallback) (WCHAR*, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; _tmain(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; argc, _TCHAR* argv[]) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    HINSTANCE hInstance;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    myCallback ptrToFunc;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR* results = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ((hInstance = LoadLibrary(L&lt;span style="color:#006080;"&gt;&amp;quot;C:\\Users\\angel.hernandez\\Desktop\\WWSAPI\\WWSAPIDemo\\x64\\Debug\\WWSAPIDemo.dll&amp;quot;&lt;/span&gt;)) != NULL) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ((ptrToFunc = (myCallback) GetProcAddress(hInstance, &lt;span style="color:#006080;"&gt;&amp;quot;GetFeeds&amp;quot;&lt;/span&gt;)) != NULL) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            results = ptrToFunc(L&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/MSDN.xml&amp;quot;&lt;/span&gt;, -1);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            wprintf(L&lt;span style="color:#006080;"&gt;&amp;quot;\n%ls\n&amp;quot;&lt;/span&gt;, results);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            FreeLibrary(hInstance);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            printf(&lt;span style="color:#006080;"&gt;&amp;quot;\n\nPress any key to exit...\n&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            _getch();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; 0;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;After compiling, linking and executing our NativeTester application, we can see how the RSS feeds are displayed on the console.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/8422.NativeTester_5F00_547A30AE.png"&gt;&lt;img height="301" width="590" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/1581.NativeTester_5F00_thumb_5F00_4920F6A4.png" alt="NativeTester" border="0" title="NativeTester" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;GetItem&lt;/em&gt;&lt;/strong&gt; is another exported function in our DLL which displays a found element (if any) after executing an&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Xpath"&gt;XPath&lt;/a&gt; query and using the &lt;strong&gt;&lt;em&gt;starts-with&lt;/em&gt;&lt;/strong&gt; function (as if it was the &lt;strong&gt;&lt;em&gt;Like % &lt;/em&gt;&lt;/strong&gt;operator). &lt;strong&gt;&lt;em&gt;GetItem&lt;/em&gt;&lt;/strong&gt; retrieves the RSS feeds by previously calling the &lt;strong&gt;&lt;em&gt;GetFeeds &lt;/em&gt;&lt;/strong&gt;function.&lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;// Execute XPATH Query based on feeds retrieved through WWSAPI&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;EXPORT &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; GetItem(WCHAR* szUrl, WCHAR* szItemName) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR retval[TRIM_SIZE];&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR* results = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    BSTR nodeContent = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR xPathQueryBuffer[TRIM_SIZE];&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    IXMLDOMDocumentPtr docPtr = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    IXMLDOMNodePtr selectedNode = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ((results = GetFeeds(szUrl, -1)) != NULL &amp;amp;&amp;amp;  wcslen(results) &amp;gt; 0) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        CoInitialize(NULL);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        docPtr.CreateInstance(&lt;span style="color:#006080;"&gt;&amp;quot;Msxml2.DOMDocument.6.0&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        wsprintf(xPathQueryBuffer, L&lt;span style="color:#006080;"&gt;&amp;quot;/rss/items/item[starts-with(@title,&amp;#39;%ls&amp;#39;)]&amp;quot;&lt;/span&gt;, szItemName);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (SUCCEEDED(docPtr-&amp;gt;loadXML(_bstr_t(results), NULL))) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (SUCCEEDED(docPtr-&amp;gt;selectSingleNode(_bstr_t(xPathQueryBuffer), &amp;amp;selectedNode))) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                nodeContent = SysAllocString(retval);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                selectedNode-&amp;gt;get_xml(&amp;amp;nodeContent);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                MessageBox(NULL, nodeContent, L&lt;span style="color:#006080;"&gt;&amp;quot;XPath Query Results&amp;quot;&lt;/span&gt;, NULL);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                SysFreeString(nodeContent);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;So far we&amp;rsquo;ve been able to implement and use WWSAPI from native code, however we haven&amp;rsquo;t tested our Dll&amp;rsquo;s&amp;nbsp; functionality&amp;nbsp; from .NET, in that case the first thing to do is, &amp;ldquo;to import&amp;rdquo; the function we&amp;rsquo;re interested on by specifying the &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx"&gt;DllImport&lt;/a&gt; attribute.&lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;[DllImport(&lt;span style="color:#006080;"&gt;@&amp;quot;C:\Users\angel.hernandez\Desktop\WWSAPI\WWSAPIDemo\x64\Debug\WWSAPIDemo.dll&amp;quot;&lt;/span&gt;, CharSet = CharSet.Unicode)]&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;extern&lt;/span&gt; IntPtr GetFeeds(IntPtr szUrl, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; cbResults);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;The &lt;strong&gt;&lt;em&gt;GetFeeds&lt;/em&gt;&lt;/strong&gt; function returns a&amp;nbsp; WCHAR* which in turn is interpreted by .NET as an &lt;a href="http://msdn.microsoft.com/en-us/library/system.intptr.aspx"&gt;IntPtr&lt;/a&gt;. We also need to use the &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.aspx"&gt;Marshal&lt;/a&gt; class to convert it from&amp;nbsp; WCHAR* to an Unicode string and to pass a&amp;nbsp; WCHAR* as parameter to the function &lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; btnTestWWSAPI_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    IntPtr szUrl = Marshal.StringToBSTR(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/MSDN.xml&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    MessageBox.Show(Marshal.PtrToStringUni(GetFeeds(szUrl, -1)));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    Marshal.FreeBSTR(szUrl);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;and Voila!!! I have my WWSAPI implementation being consumed and used from .NET, well.. from a WinForm application, but what about a WPF application? The answer is&amp;hellip; the implementation remains the same except for the&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/XAML"&gt;XAML&lt;/a&gt; code required plus the databinding&amp;nbsp; process is quite simple if an&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.xmldataprovider.aspx"&gt;XmlDataProvider&lt;/a&gt; is used because the data is extracted and assigned based on an XPath syntax. &lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!-- Data Provider--&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window.Resources&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;XmlDataProvider&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;xmlFeeds&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;IsAsynchronous&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;XPath&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;/rss/items/item&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window.Resources&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;grdFeeds&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;0,75,0,12&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;&amp;lt;!-- Binding Source--&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListView&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;11.432,6&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;lstFeeds&amp;quot;&lt;/span&gt;  &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;             &lt;span style="color:#ff0000;"&gt;ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{Binding Source={StaticResource xmlFeeds} }&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;MouseDoubleClick&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;lstFeeds_MouseDoubleClick&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListView.View&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridView&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;grdFeedItems&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridViewColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Header&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Title&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;grcTitle&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DisplayMemberBinding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{Binding XPath=@title}&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridViewColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Header&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Publishing Date&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;grcPublishingDate&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DisplayMemberBinding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{Binding XPath=@publishingDate}&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridViewColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Header&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Url&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;grcUrl&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DisplayMemberBinding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{Binding XPath=@url}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridView&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListView.View&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListView&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;The Button Click event handler is shown below &lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; btnExecuteOperation_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, RoutedEventArgs e) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    XmlDocument feeds = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XmlDocument();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    IntPtr szUrl = IntPtr.Zero, szItemName = IntPtr.Zero;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    XmlDataProvider xmlFeeds = TryFindResource(&lt;span style="color:#006080;"&gt;&amp;quot;xmlFeeds&amp;quot;&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; XmlDataProvider;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;switch&lt;/span&gt; (cboOperations.SelectedIndex) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; 0:&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (RSSFeedService proxy = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; RSSFeedService())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    feeds.LoadXml(proxy.RetrieveFeeds(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/MSDN.xml&amp;quot;&lt;/span&gt;, -1));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                xmlFeeds.Document = feeds;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; 1:&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                szUrl = Marshal.StringToBSTR(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/MSDN.xml&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                feeds.LoadXml(Marshal.PtrToStringUni(GetFeeds(szUrl, -1)));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                Marshal.FreeBSTR(szUrl);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                xmlFeeds.Document = feeds;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; 2:&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                szUrl = Marshal.StringToBSTR(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/MSDN.xml&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                szItemName = Marshal.StringToBSTR(!&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(txtItemTitle.Text) ? txtItemTitle.Text : &lt;span style="color:#006080;"&gt;&amp;quot;Windows&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                GetItem(szUrl, szItemName);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                Marshal.FreeBSTR(szUrl);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                Marshal.FreeBSTR(szItemName);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    } &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception ex) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        MessageBox.Show(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;Oops! Something wrong just occurred\n{0}&amp;quot;&lt;/span&gt;, ex.Message),&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#006080;"&gt;&amp;quot;Exception caught&amp;quot;&lt;/span&gt;, MessageBoxButton.OK, MessageBoxImage.Information);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Attached to this post you can find the code, please feel free to download it, modify it and play with it. I hope you consider this information useful and always remember one thing&amp;hellip; The only possible way to learn is by playing with the technology and feel confident about taking risks. &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;God bless you&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;A&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;ngel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1727883" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>WWSAPI (Windows Web Services API) + Interop + WPF… Chévere!!!</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/09/28/wwsapi-windows-web-services-api-interop-wpf-ch-233-vere.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="1181080" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.72.77.92/WWSAPI.zip" /><id>/blogs/angelhernandez/archive/2009/09/28/wwsapi-windows-web-services-api-interop-wpf-ch-233-vere.aspx</id><published>2009-09-28T06:11:00Z</published><updated>2009-09-28T06:11:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hace un par de noches atr&amp;aacute;s estaba leyendo sobre las caracter&amp;iacute;sticas nuevas del SDK de Windows 7 y puedo decir que&amp;nbsp; son bastantes, de hecho en una de las sesiones que tuve en &lt;a href="http://msmvps.com/blogs/angelhernandez/archive/2009/09/10/slide-deck-and-demo-for-quot-blue-theater-quot-session-and-tech-talk-l-225-minas-y-demo-utilizados-para-mi-sesi-243-n-en-quot-blue-theater-quot-y-tech-talk.aspx"&gt;Tech-Ed&lt;/a&gt; este a&amp;ntilde;o mencion&amp;eacute; algunas de ellas. Sin embargo, una que llam&amp;oacute; mi atenci&amp;oacute;n fue WWSAPI pues hasta ahora no exist&amp;iacute;a soporte para c&amp;oacute;digo nativo, excepto por un par de Toolkits existentes entre ellos &lt;a href="http://www.cs.fsu.edu/~engelen/soap.html"&gt;gSOAP&lt;/a&gt; que puede utilizarse con Windows, Linux y Mac OSX. WWSAPI fue presentado en el &lt;a href="http://microsoftpdc.com/"&gt;PDC&lt;/a&gt; del a&amp;ntilde;o pasado (2008) y ser&amp;aacute; liberado formalmente con Windows 7 aunque versiones anteriores del sistema operativo, a partir de XP SP2. Yo lo prob&amp;eacute; inicialmente cuando Windows 7 estaba en RC sin embargo no hab&amp;iacute;a posteado al respecto por esperar que Windows 7 fuese liberado o cerca de serlo.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Una vez dicho esto, durante el fin de semana cre&amp;eacute; una soluci&amp;oacute;n para demostrar WWSAPI en conjunto con .NET. La soluci&amp;oacute;n tiene la estructura mostrada a continuaci&amp;oacute;n&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6787.Solution_5F00_31DA0632.png"&gt;&lt;img height="142" width="244" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/5466.Solution_5F00_thumb_5F00_16C13724.png" alt="Solution" border="0" title="Solution" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;NativeTester:&lt;/em&gt;&lt;/strong&gt; Aplicaci&amp;oacute;n de Consola (C++) que llama a la biblioteca de enlace din&amp;aacute;mico (DLL)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;RSSFeedService&lt;/em&gt;&lt;/strong&gt;: Servicio Web (C#) que recupera entradas RSS, las parsea y regresa el resultado como XML&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;RSSViewer&lt;/em&gt;&lt;/strong&gt;: Aplicaci&amp;oacute;n basada en WPF (C#) que consume el servicio Web e invoca a la biblioteca de enlace din&amp;aacute;mico (DLL)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;Tester:&lt;/em&gt;&lt;/strong&gt; Aplicaci&amp;oacute;n basada en WinForm (C#) que consume el servicio Web e invoca a la biblioteca de enlace din&amp;aacute;mico (DLL)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;em&gt;WWSAPIDemo:&lt;/em&gt;&lt;/strong&gt; Biblioteca de enlace din&amp;aacute;mico (C++) que implementa WWSAPI y es invocada desde .NET a trav&amp;eacute;s de Interop&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;As&amp;iacute; mismo con el c&amp;oacute;digo pueden encontrar MSDN.xml que son las entradas RSS de la p&amp;aacute;gina de &lt;a href="http://blogs.msdn.com/ausdev/rss.xml"&gt;MSDN Australia&lt;/a&gt;, aunque el c&amp;oacute;digo apunta a &lt;a href="http://localhost/MSDN.xml" title="http://localhost/MSDN.xml"&gt;http://localhost/MSDN.xml&lt;/a&gt;, ustedes pueden cambiar dicho Url y apuntar al RSS que gusten, en mi caso guard&amp;eacute; el archivo de entradas RSS y lo pus&amp;eacute; en my &lt;a href="http://en.wikipedia.org/wiki/Internet_Information_Services"&gt;IIS&lt;/a&gt; local.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Muchos de ustedes se preguntar&amp;aacute;n, &amp;iquest;c&amp;oacute;mo genero el proxy del servicio Web desde C++? Y la respuesta es muy simple, el nuevo &lt;a href="http://msdn.microsoft.com/en-us/windows/bb980924.aspx"&gt;SDK&lt;/a&gt; de Windows 7 trae consigo un utilitario que lo hace por nosotros,&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/dd430644(VS.85).aspx"&gt;WSUTIL.exe&lt;/a&gt;. La ejecuci&amp;oacute;n nos da como resultado dos archivos (uno .H y otro .CPP). Las cadenas por defecto son tratadas como &lt;a href="http://msdn.microsoft.com/en-us/library/ms684497(EXCHG.10).aspx"&gt;WCHAR&lt;/a&gt;* que es &lt;a href="http://en.wikipedia.org/wiki/Unicode"&gt;Unicode&lt;/a&gt; y todas las cadenas en .NET son interpretadas como &lt;a href="http://en.wikipedia.org/wiki/Unicode"&gt;Unicode&lt;/a&gt;, m&amp;aacute;s adelante comentar&amp;eacute; un poco de esto.&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/7345.wsutil_5F00_7893796F.png"&gt;&lt;img height="102" width="622" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/2555.wsutil_5F00_thumb_5F00_09D368E1.png" alt="wsutil" border="0" title="wsutil" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Con el servicio Web ya publicado en IIS, entonces nos queda comenzar a trabajar en la biblioteca de enlace din&amp;aacute;mico que ser&amp;aacute; cliente e implementar&amp;aacute; WWSAPI. A continuaci&amp;oacute;n el archivo de cabecera de la biblioteca&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#cc6633;"&gt;#include&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;stdafx.h&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#cc6633;"&gt;#define&lt;/span&gt; EXPORT &lt;span style="color:#0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; __declspec(dllexport)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#cc6633;"&gt;#define&lt;/span&gt; MAX_SIZE  128000 &lt;span style="color:#008000;"&gt;//128Kb&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#cc6633;"&gt;#define&lt;/span&gt; TRIM_SIZE 512&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;EXPORT WCHAR* GetFeeds(WCHAR* szUrl, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; cbResults);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;EXPORT &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; GetItem(WCHAR* szUrl, WCHAR* szItemName);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;as&amp;iacute; como el m&amp;eacute;todo que se conecta al servicio Web y recupera las entradas de RSS&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;// Get feeds from a given Url through WWSAPI&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;EXPORT WCHAR* GetFeeds(WCHAR* szUrl, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; cbResults) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR* temp = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_HEAP* heap = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR retval[MAX_SIZE]; &lt;span style="color:#008000;"&gt;// 128Kb (It should be enough to avoid WS_E_QUOTA_EXCEEDED error)&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_ERROR* error = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    ULONG propertiesCount = 0;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_SERVICE_PROXY* proxy = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_CHANNEL_PROPERTY channelProps[2]; &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_STRING serviceUrl = WS_STRING_VALUE(L&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/DemoSvc/RSSFeedService.asmx&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_ENDPOINT_ADDRESS endpoint = { serviceUrl}; &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_ENVELOPE_VERSION soapVersion = WS_ENVELOPE_VERSION_SOAP_1_1; &lt;span style="color:#008000;"&gt;// Our Webservice is WsiProfiles.BasicProfile1_1 compliant&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WS_ADDRESSING_VERSION addressingVersion = WS_ADDRESSING_VERSION_TRANSPORT;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;// Set channel&amp;#39;s properties&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].id = WS_CHANNEL_PROPERTY_ENVELOPE_VERSION;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].value = &amp;amp;soapVersion;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].valueSize = &lt;span style="color:#0000ff;"&gt;sizeof&lt;/span&gt;(soapVersion);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    propertiesCount++;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;// Set addressing&amp;#39;s properties&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].id = WS_CHANNEL_PROPERTY_ADDRESSING_VERSION;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].value = &amp;amp;addressingVersion;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    channelProps[propertiesCount].valueSize = &lt;span style="color:#0000ff;"&gt;sizeof&lt;/span&gt;(addressingVersion);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    propertiesCount++;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;// Can we create an WsError and WsHeap objects?&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (SUCCEEDED(WsCreateError(NULL, NULL, &amp;amp;error)) &amp;amp;&amp;amp; SUCCEEDED(WsCreateHeap(MAX_SIZE, TRIM_SIZE, NULL, NULL, &amp;amp;heap, error))) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#008000;"&gt;// Can we create a proxy based on the service?&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;  (SUCCEEDED(WsCreateServiceProxy(WS_CHANNEL_TYPE_REQUEST, WS_HTTP_CHANNEL_BINDING, NULL, NULL, NULL, &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            channelProps, propertiesCount, &amp;amp;proxy, error))) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#008000;"&gt;// Can we open the proxy object?&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;  (SUCCEEDED(WsOpenServiceProxy(proxy, &amp;amp;endpoint, NULL, error))) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    &lt;span style="color:#008000;"&gt;// If we&amp;#39;re able to invoke the service then copy the results to another variable because if&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    &lt;span style="color:#008000;"&gt;// we don&amp;#39;t we lose the response after freeing the heap&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (SUCCEEDED(RSSFeedServiceSoap12_RetrieveFeeds(proxy, szUrl, cbResults, &amp;amp;temp, heap, NULL, NULL, NULL, error))) &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        wcscpy_s(retval, temp);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;// Deallocate and free resources&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (error != NULL)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        WsFreeError(error);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (proxy != NULL) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        WsCloseServiceProxy(proxy, NULL, error);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        WsFreeServiceProxy(proxy);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (heap != NULL)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        WsFreeHeap(heap);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Por favor, n&amp;oacute;tese lo siguiente:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Debemos especificar la versi&amp;oacute;n de &lt;a href="http://en.wikipedia.org/wiki/SOAP"&gt;SOAP&lt;/a&gt; (de lo contrario, el cliente se va a quejar al respecto, porque va a utilizar 1.2. Prueba de esto, es el nombre del m&amp;eacute;todo &lt;em&gt;&lt;strong&gt;RSSFeedServiceSoap12&lt;/strong&gt;&lt;/em&gt;)&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Regreso un WCHAR* y funciona sin problemas, aunque la manera correcta deber&amp;iacute;a ser es regresar un &lt;a href="http://en.wikipedia.org/wiki/HRESULT"&gt;HRESULT&lt;/a&gt; o un entero, tomar un puntero como par&amp;aacute;metro que al mismo tiempo sirve de valor de retorno. Un documento sobre las mejores pr&amp;aacute;cticas de desarrollo de DLLs puede encontrarse &lt;a href="http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx"&gt;aqu&amp;iacute;&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Nuestra implementaci&amp;oacute;n desde la aplicaci&amp;oacute;n de consola es mostrada a continuaci&amp;oacute;n&lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#cc6633;"&gt;#include&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;stdafx.h&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;typedef&lt;/span&gt; WCHAR* (*myCallback) (WCHAR*, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; _tmain(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; argc, _TCHAR* argv[]) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    HINSTANCE hInstance;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    myCallback ptrToFunc;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR* results = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ((hInstance = LoadLibrary(L&lt;span style="color:#006080;"&gt;&amp;quot;C:\\Users\\angel.hernandez\\Desktop\\WWSAPI\\WWSAPIDemo\\x64\\Debug\\WWSAPIDemo.dll&amp;quot;&lt;/span&gt;)) != NULL) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ((ptrToFunc = (myCallback) GetProcAddress(hInstance, &lt;span style="color:#006080;"&gt;&amp;quot;GetFeeds&amp;quot;&lt;/span&gt;)) != NULL) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            results = ptrToFunc(L&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/MSDN.xml&amp;quot;&lt;/span&gt;, -1);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            wprintf(L&lt;span style="color:#006080;"&gt;&amp;quot;\n%ls\n&amp;quot;&lt;/span&gt;, results);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            FreeLibrary(hInstance);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            printf(&lt;span style="color:#006080;"&gt;&amp;quot;\n\nPress any key to exit...\n&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            _getch();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; 0;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Al compilar y ejecutar nuestra aplicaci&amp;oacute;n de prueba NativeTester, podemos ver como se muestran las entradas recuperadas en la consola.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/8422.NativeTester_5F00_547A30AE.png"&gt;&lt;img height="301" width="590" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/1581.NativeTester_5F00_thumb_5F00_4920F6A4.png" alt="NativeTester" border="0" title="NativeTester" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;La otra funci&amp;oacute;n contenida en la biblioteca de enlace din&amp;aacute;mico es &lt;strong&gt;&lt;em&gt;GetItem&lt;/em&gt;&lt;/strong&gt;, que muestra el elemento encontrado tras la ejecuci&amp;oacute;n de una consulta de &lt;a href="http://en.wikipedia.org/wiki/Xpath"&gt;XPath&lt;/a&gt; y haciendo uso de la funci&amp;oacute;n &lt;strong&gt;&lt;em&gt;starts-with&lt;/em&gt;&lt;/strong&gt; (como si fuera el operador &lt;strong&gt;&lt;em&gt;Like %&lt;/em&gt;&lt;/strong&gt;). La funci&amp;oacute;n &lt;strong&gt;&lt;em&gt;GetItem&lt;/em&gt;&lt;/strong&gt; recupera las entradas RSS al llamar previamente a la funci&amp;oacute;n &lt;strong&gt;&lt;em&gt;GetFeeds&lt;/em&gt;&lt;/strong&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;// Execute XPATH Query based on feeds retrieved through WWSAPI&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;EXPORT &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; GetItem(WCHAR* szUrl, WCHAR* szItemName) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR retval[TRIM_SIZE];&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR* results = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    BSTR nodeContent = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    WCHAR xPathQueryBuffer[TRIM_SIZE];&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    IXMLDOMDocumentPtr docPtr = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    IXMLDOMNodePtr selectedNode = NULL;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ((results = GetFeeds(szUrl, -1)) != NULL &amp;amp;&amp;amp;  wcslen(results) &amp;gt; 0) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        CoInitialize(NULL);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        docPtr.CreateInstance(&lt;span style="color:#006080;"&gt;&amp;quot;Msxml2.DOMDocument.6.0&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        wsprintf(xPathQueryBuffer, L&lt;span style="color:#006080;"&gt;&amp;quot;/rss/items/item[starts-with(@title,&amp;#39;%ls&amp;#39;)]&amp;quot;&lt;/span&gt;, szItemName);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (SUCCEEDED(docPtr-&amp;gt;loadXML(_bstr_t(results), NULL))) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (SUCCEEDED(docPtr-&amp;gt;selectSingleNode(_bstr_t(xPathQueryBuffer), &amp;amp;selectedNode))) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                nodeContent = SysAllocString(retval);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                selectedNode-&amp;gt;get_xml(&amp;amp;nodeContent);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                MessageBox(NULL, nodeContent, L&lt;span style="color:#006080;"&gt;&amp;quot;XPath Query Results&amp;quot;&lt;/span&gt;, NULL);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                SysFreeString(nodeContent);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hasta ahora hemos logrado implementar y utilizar WWSAPI desde c&amp;oacute;digo nativo, sin embargo a&amp;uacute;n no hemos probado la funcionalidad de nuestra biblioteca de enlace din&amp;aacute;mico desde .NET, en ese caso lo primero que debemos hacer es importar la funci&amp;oacute;n que nos interesa a trav&amp;eacute;s de &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx"&gt;DllImport&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;[DllImport(&lt;span style="color:#006080;"&gt;@&amp;quot;C:\Users\angel.hernandez\Desktop\WWSAPI\WWSAPIDemo\x64\Debug\WWSAPIDemo.dll&amp;quot;&lt;/span&gt;, CharSet = CharSet.Unicode)]&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;extern&lt;/span&gt; IntPtr GetFeeds(IntPtr szUrl, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; cbResults);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;La&amp;nbsp; funci&amp;oacute;n &lt;strong&gt;&lt;em&gt;GetFeeds&lt;/em&gt;&lt;/strong&gt; retorna un WCHAR* que es traducido a NET como un &lt;a href="http://msdn.microsoft.com/en-us/library/system.intptr.aspx"&gt;IntPtr&lt;/a&gt;, as&amp;iacute; mismo hacemos uso&amp;nbsp; de la clase &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.aspx"&gt;Marshal&lt;/a&gt; para traducir el WCHAR* a una cadena Unicode y para pasar un WCHAR* a la funci&amp;oacute;n, como es mostrado a continuaci&amp;oacute;n&lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; btnTestWWSAPI_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    IntPtr szUrl = Marshal.StringToBSTR(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/MSDN.xml&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    MessageBox.Show(Marshal.PtrToStringUni(GetFeeds(szUrl, -1)));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    Marshal.FreeBSTR(szUrl);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Y Voila!!! Tengo mi implementaci&amp;oacute;n de WWSAPI siendo utilizada desde .NET, bueno al menos desde una aplicaci&amp;oacute;n Windows Form, pero &amp;iquest;c&amp;oacute;mo ser&amp;aacute; con una aplicaci&amp;oacute;n WPF? Pues&amp;hellip; la respuesta es ser&amp;aacute; igual, a diferencia de que debes escribir el &lt;a href="http://en.wikipedia.org/wiki/XAML"&gt;XAML&lt;/a&gt; y que hacer binding a los objetos es m&amp;aacute;s sencillo si se utiliza un &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.xmldataprovider.aspx"&gt;XmlDataProvider&lt;/a&gt; pues los datos se extraen y asignan utilizando una sintaxis basada en XPath.&lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!-- Data Provider--&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window.Resources&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;XmlDataProvider&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;xmlFeeds&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;IsAsynchronous&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;XPath&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;/rss/items/item&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window.Resources&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;grdFeeds&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;0,75,0,12&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;&amp;lt;!-- Binding Source--&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListView&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;11.432,6&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;lstFeeds&amp;quot;&lt;/span&gt;  &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;             &lt;span style="color:#ff0000;"&gt;ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{Binding Source={StaticResource xmlFeeds} }&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;MouseDoubleClick&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;lstFeeds_MouseDoubleClick&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListView.View&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridView&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;grdFeedItems&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridViewColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Header&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Title&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;grcTitle&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DisplayMemberBinding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{Binding XPath=@title}&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridViewColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Header&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Publishing Date&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;grcPublishingDate&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DisplayMemberBinding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{Binding XPath=@publishingDate}&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridViewColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Header&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Url&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;grcUrl&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DisplayMemberBinding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{Binding XPath=@url}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridView&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListView.View&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListView&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;El manejador del evento Click del bot&amp;oacute;n para llamar a nuestra biblioteca de enlace din&amp;aacute;mico es mostrado a continuaci&amp;oacute;n&lt;/span&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; btnExecuteOperation_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, RoutedEventArgs e) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    XmlDocument feeds = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XmlDocument();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    IntPtr szUrl = IntPtr.Zero, szItemName = IntPtr.Zero;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    XmlDataProvider xmlFeeds = TryFindResource(&lt;span style="color:#006080;"&gt;&amp;quot;xmlFeeds&amp;quot;&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; XmlDataProvider;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;switch&lt;/span&gt; (cboOperations.SelectedIndex) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; 0:&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (RSSFeedService proxy = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; RSSFeedService())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    feeds.LoadXml(proxy.RetrieveFeeds(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/MSDN.xml&amp;quot;&lt;/span&gt;, -1));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                xmlFeeds.Document = feeds;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; 1:&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                szUrl = Marshal.StringToBSTR(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/MSDN.xml&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                feeds.LoadXml(Marshal.PtrToStringUni(GetFeeds(szUrl, -1)));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                Marshal.FreeBSTR(szUrl);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                xmlFeeds.Document = feeds;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; 2:&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                szUrl = Marshal.StringToBSTR(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/MSDN.xml&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                szItemName = Marshal.StringToBSTR(!&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(txtItemTitle.Text) ? txtItemTitle.Text : &lt;span style="color:#006080;"&gt;&amp;quot;Windows&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                GetItem(szUrl, szItemName);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                Marshal.FreeBSTR(szUrl);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                Marshal.FreeBSTR(szItemName);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    } &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception ex) {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        MessageBox.Show(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;Oops! Something wrong just occurred\n{0}&amp;quot;&lt;/span&gt;, ex.Message),&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#006080;"&gt;&amp;quot;Exception caught&amp;quot;&lt;/span&gt;, MessageBoxButton.OK, MessageBoxImage.Information);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;El post tiene adjunto el c&amp;oacute;digo mostrado, pueden descargarlo, modificarlo y jugar con &amp;eacute;l. Espero que sea de utilidad y recuerden, la &amp;uacute;nica manera de aprender es jugar con la tecnolog&amp;iacute;a y no tener miedo para asumir nuevos retos.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Que Dios los bendiga.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;A&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;ngel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1727792" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>A couple of pictures from Microsoft Tech-Ed 2009 / Un par de fotos de Microsoft Tech-Ed 2009</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/09/23/a-couple-of-pictures-from-microsoft-tech-ed-2009-un-par-de-fotos-de-microsoft-tech-ed-2009.aspx" /><id>/blogs/angelhernandez/archive/2009/09/23/a-couple-of-pictures-from-microsoft-tech-ed-2009-un-par-de-fotos-de-microsoft-tech-ed-2009.aspx</id><published>2009-09-23T04:18:00Z</published><updated>2009-09-23T04:18:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hi Community, &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Please find attached a couple of pictures from &lt;a href="http://www.msteched.com/australia/Public/default.aspx"&gt;Microsoft TechEd&lt;/a&gt;, they were taken and sent to me by our ANZ&amp;nbsp; MVP Lead (Roseanne Stamell). In Picture 1,&amp;nbsp; my fellow MVP and mate, &lt;a href="http://weblogs.asp.net/pglavich"&gt;Paul Glavich&lt;/a&gt; and I. Picture 2, it&amp;rsquo;s just&amp;nbsp; me getting ready to start&amp;nbsp;a Mini Theatre session.&amp;nbsp; .&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;
&lt;hr /&gt;
&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hola Comunidad, &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Por favor vean adjuntas un par de fotos desde &lt;a href="http://www.msteched.com/australia/Public/default.aspx"&gt;Microsoft TechEd&lt;/a&gt;, las cuales fueron tomadas y enviadas por nuestra l&amp;iacute;der MVP (Roseanne Stamell). En la foto 1,&amp;nbsp; un colega MVP y amigo,&amp;nbsp; &lt;a href="http://weblogs.asp.net/pglavich"&gt;Paul Glavich&lt;/a&gt; y yo. Foto 2, soy yo prepar&amp;aacute;ndome para comenzar una sesi&amp;oacute;n en un mini teatro.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/0116.DSC01693_5F00_2545A935.jpg"&gt;&lt;img height="531" width="772" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/4237.DSC01693_5F00_thumb_5F00_16F70A78.jpg" alt="DSC01693" border="0" title="DSC01693" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/5807.DSC01719_5F00_64638738.jpg"&gt;&lt;img height="508" width="774" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/2677.DSC01719_5F00_thumb_5F00_35BD5889.jpg" alt="DSC01719" border="0" title="DSC01719" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1725902" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Adding client-side capabilities to our Webparts</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/09/22/adding-client-side-capabilities-to-our-webparts.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="3324" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.72.56.48/Code.zip" /><id>/blogs/angelhernandez/archive/2009/09/22/adding-client-side-capabilities-to-our-webparts.aspx</id><published>2009-09-22T05:52:00Z</published><updated>2009-09-22T05:52:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;A couple of weeks ago I was attending and presenting at &lt;a href="http://www.msteched.com/australia/Public/default.aspx"&gt;Microsoft TechEd&lt;/a&gt; on Gold Coast, when I got a phone call from our Sales Manager. &lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;The mission&lt;/span&gt;&lt;/strong&gt;: Develop a new webpart for an existing &lt;a href="http://en.wikipedia.org/wiki/Business-to-business"&gt;B2B&lt;/a&gt; portal which integrates &lt;a href="http://www.sap.com"&gt;SAP&lt;/a&gt;, &lt;a href="http://www-01.ibm.com/software/integration/wmq/"&gt;MQ&lt;/a&gt;, &lt;a href="http://crm.dynamics.com/"&gt;CRM&lt;/a&gt; and &lt;a href="http://www.softwareag.com/"&gt;webMethods&lt;/a&gt; through &lt;a href="http://sharepoint.microsoft.com/Pages/Default.aspx"&gt;SharePoint&lt;/a&gt;. &lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;The challenge:&lt;/span&gt;&lt;/strong&gt; Write some Javascript code&amp;nbsp; to do some processing on the server-side based on the user&amp;rsquo;s input.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;I&amp;rsquo;ve been doing some SharePoint development for a while and if you know how to do things on &lt;a href="http://asp.net"&gt;ASP.NET&lt;/a&gt; then is not that hard to leverage those skills and use them on SharePoint. The requirements were: &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Allow user input and perform some validation on the browser-side &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Add AJAX capabilities to deliver a responsive UI to the users &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Grab information stored on the client-side (browser) from the server-side and do some processing against CRM&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;So let&amp;rsquo;s start from the beginning explaining how I got this done&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Properties required&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; DataTable SearchResults {&lt;/pre&gt;
&lt;pre&gt;            get {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;p&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; (ViewState[&lt;span class="str"&gt;&amp;quot;block_orders&amp;quot;&lt;/span&gt;] != &lt;span class="kwrd"&gt;null&lt;/span&gt; ?&lt;br /&gt;                 (DataTable)ViewState[&lt;span class="str"&gt;&amp;quot;block_orders&amp;quot;&lt;/span&gt;] : &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/p&gt;&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;            set {&lt;/pre&gt;
&lt;pre&gt;                ViewState[&lt;span class="str"&gt;&amp;quot;block_orders&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;         &lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GridViewSortCondition {&lt;/pre&gt;
&lt;pre class="alt"&gt;            get {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (ViewState[&lt;span class="str"&gt;&amp;quot;SortCondition&amp;quot;&lt;/span&gt;] == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;                    ViewState[&lt;span class="str"&gt;&amp;quot;SortCondition&amp;quot;&lt;/span&gt;] = &lt;span class="str"&gt;&amp;quot;sapSearch ASC&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; ViewState[&lt;span class="str"&gt;&amp;quot;SortCondition&amp;quot;&lt;/span&gt;].ToString();&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;            set {&lt;/pre&gt;
&lt;pre&gt;                ViewState[&lt;span class="str"&gt;&amp;quot;SortCondition&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; SortDirection GridViewSortDirection {&lt;/pre&gt;
&lt;pre class="alt"&gt;            get {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (ViewState[&lt;span class="str"&gt;&amp;quot;SortDirection&amp;quot;&lt;/span&gt;] == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;                    ViewState[&lt;span class="str"&gt;&amp;quot;SortDirection&amp;quot;&lt;/span&gt;] = SortDirection.Ascending;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; (SortDirection)ViewState[&lt;span class="str"&gt;&amp;quot;SortDirection&amp;quot;&lt;/span&gt;];&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;            set {&lt;/pre&gt;
&lt;pre&gt;                ViewState[&lt;span class="str"&gt;&amp;quot;SortDirection&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; SortExpression {&lt;/pre&gt;
&lt;pre class="alt"&gt;            get {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; (ViewState[&lt;span class="str"&gt;&amp;quot;sort_exp&amp;quot;&lt;/span&gt;] != &lt;span class="kwrd"&gt;null&lt;/span&gt; ?&lt;/pre&gt;
&lt;pre&gt;                  ViewState[&lt;span class="str"&gt;&amp;quot;sort_exp&amp;quot;&lt;/span&gt;].ToString() : &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty);&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;            set {&lt;/pre&gt;
&lt;pre class="alt"&gt;                ViewState[&lt;span class="str"&gt;&amp;quot;sort_exp&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; SelectedCheckBoxes {&lt;/pre&gt;
&lt;pre&gt;            get {&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; (ViewState[&lt;span class="str"&gt;&amp;quot;selected_check_boxes&amp;quot;&lt;/span&gt;] != &lt;span class="kwrd"&gt;null&lt;/span&gt; ?&lt;/pre&gt;
&lt;pre&gt;                    ViewState[&lt;span class="str"&gt;&amp;quot;selected_check_boxes&amp;quot;&lt;/span&gt;].ToString() : &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty);&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;            set {&lt;/pre&gt;
&lt;pre class="alt"&gt;                ViewState[&lt;span class="str"&gt;&amp;quot;selected_check_boxes&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;I need to store the search results so the user can perform&amp;nbsp; paging and sorting operations on the result set&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Now, let&amp;rsquo;s proceed to the code required to add AJAX functionality, I usually break down the UI code into pieces, I mean, a method to generate the top, middle and bottom parts of a webpart. Since I&amp;rsquo;m implementing some AJAX I enclose everything inside a &lt;a href="http://en.wikipedia.org/wiki/Span_and_div"&gt;&amp;lt;DIV&amp;gt;&lt;/a&gt; so the code required looks like this&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddAJAXControls() {&lt;/pre&gt;
&lt;pre&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Literal() { Text = &lt;span class="str"&gt;&amp;quot;&amp;lt;div&amp;gt;&amp;quot;&lt;/span&gt;, ID = &lt;span class="str"&gt;&amp;quot;mainDiv&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; ScriptManager() { ID = &lt;span class="str"&gt;&amp;quot;scriptManager_OrderBlock&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Literal() { Text = InjectScriptToDisableDoublePostBack() });&lt;/pre&gt;
&lt;pre class="alt"&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; UpdatePanel() { ID = &lt;span class="str"&gt;&amp;quot;updatePanel_OrderBlock&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Please note the call to &lt;strong&gt;&lt;em&gt;&amp;ldquo;InjectScriptToDisableDoublePostback&amp;rdquo;&lt;/em&gt;&lt;/strong&gt; method, it&amp;rsquo;s responsible for disabling the control which has triggered the postback (e.g.: a submit button) so the user won&amp;rsquo;t be able to &amp;ldquo;re-submit&amp;rdquo; the form more than once, the code is shown below&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; InjectScriptToDisableDoublePostBack() {&lt;/pre&gt;
&lt;pre&gt;            StringBuilder retval = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;&amp;lt;script type=&amp;#39;text/javascript&amp;#39;&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;var pbControl = null;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;var prm = Sys.WebForms.PageRequestManager.getInstance();&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;prm.add_beginRequest(BeginRequestHandler);&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;prm.add_endRequest(EndRequestHandler);&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;function BeginRequestHandler(sender, args) {&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;//the control causing the postback&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;pbControl = args.get_postBackElement();&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;if (pbControl.id.indexOf(&amp;#39;btnSearch&amp;#39;) &amp;gt; -1 || &amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;pbControl.id.indexOf(&amp;#39;btnUpdate&amp;#39;) &amp;gt; -1 )&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;pbControl.disabled = true;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;function EndRequestHandler(sender, args) {&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;pbControl.disabled = false;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;pbControl = null;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;&amp;lt;/script&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; retval.ToString();&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;The method responsible for putting all of the pieces together and rendering the webpart is&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CreateUI() {&lt;/pre&gt;
&lt;pre&gt;            UpdatePanel panel = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="rem"&gt;// Add AJAX controls&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            AddAJAXControls();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((panel = FindControl(&lt;span class="str"&gt;&amp;quot;updatePanel_OrderBlock&amp;quot;&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; UpdatePanel) != &lt;span class="kwrd"&gt;null&lt;/span&gt;) {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="rem"&gt;// Top Table&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                panel.ContentTemplateContainer.Controls.Add(GetTopTable());&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Bottom Table&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                panel.ContentTemplateContainer.Controls.Add(GetBottomTable());&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="rem"&gt;// Close Div containing AJAX controls&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Literal() { Text = &lt;span class="str"&gt;&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;This approach gives me a clean and tidy HTML when rendered plus it&amp;rsquo;s easy to follow, debug and maintain. Now, I have all of the objects required inside a &amp;lt;DIV&amp;gt; and it&amp;rsquo;s AJAX enabled&amp;hellip; The only missing thing is our&amp;nbsp; UpdateProgress template (code is attached) which uses an animated GIF bundled in SharePoint.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;            Table retval = &lt;span class="kwrd"&gt;new&lt;/span&gt; Table() {&lt;/pre&gt;
&lt;pre&gt;                ID = &lt;span class="str"&gt;&amp;quot;tblTopTable&amp;quot;&lt;/span&gt;, CellPadding = 1,&lt;/pre&gt;
&lt;pre class="alt"&gt;                CellSpacing = 0, Width = Unit.Percentage(100)&lt;/pre&gt;
&lt;pre&gt;            };&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            retval.Rows.AddRange(&lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow[] {&lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(), &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(), &lt;/pre&gt;
&lt;pre class="alt"&gt;                                                 &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(), &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(),&lt;/pre&gt;
&lt;pre&gt;                                                 &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(), &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(),&lt;/pre&gt;
&lt;pre class="alt"&gt;                                                 &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(), &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(),&lt;/pre&gt;
&lt;pre&gt;                                                 &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow()});&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.Rows[ 8 ].Cells.AddRange(&lt;span class="kwrd"&gt;new&lt;/span&gt; TableCell[] { &lt;span class="kwrd"&gt;new&lt;/span&gt; TableCell() {&lt;/pre&gt;
&lt;pre&gt;                                                 Width=Unit.Percentage(20)}, &lt;/pre&gt;
&lt;pre class="alt"&gt;                                                            &lt;span class="kwrd"&gt;new&lt;/span&gt; TableCell() {&lt;/pre&gt;
&lt;pre&gt;                                                 Width=Unit.Percentage(60)}});&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="rem"&gt;// Update Progress&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.Rows[ 8 ].Cells[0].ColumnSpan = 2;&lt;/pre&gt;
&lt;pre&gt;            retval.Rows[ 8 ].Cells[0].HorizontalAlign = HorizontalAlign.Left;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.Rows[ 8 ].Cells[0].Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; UpdateProgress() {&lt;/pre&gt;
&lt;pre&gt;                ID = &lt;span class="str"&gt;&amp;quot;workProgress&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre class="alt"&gt;                ProgressTemplate = &lt;span class="kwrd"&gt;new&lt;/span&gt; UpdateProgressTemplate()&lt;/pre&gt;
&lt;pre&gt;            });&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Ok&amp;hellip; so far we&amp;rsquo;ve got AJAX working but what&amp;rsquo;s special about that? Well.. not much really but now we need to synchronize user&amp;rsquo;s selection on the client-side and reflect these changes on the server-side and to accomplish that we need some scripts (code is attached) and a couple of hidden fields which are referenced from our JavaScript as well as from our webpart code and for the sake of keeping things tidy we add them to the controls collection right after creating everything else (as depicted below)&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CreateChildControls() {&lt;/pre&gt;
&lt;pre&gt;            CreateUI();&lt;/pre&gt;
&lt;pre class="alt"&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; HiddenField() { ID = &lt;span class="str"&gt;&amp;quot;selected_checkboxes&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre&gt;                                             EnableViewState = &lt;span class="kwrd"&gt;true&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; HiddenField() { ID = &lt;span class="str"&gt;&amp;quot;checkboxes_cleared&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;                                             EnableViewState = &lt;span class="kwrd"&gt;true&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;            ChildControlsCreated = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;We also need to add some Javascript to support client-side operations so we do this on the &lt;strong&gt;&lt;em&gt;OnPreRender&lt;/em&gt;&lt;/strong&gt; method (AddJavaScriptToWebpart method is attached to the post)&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnPreRender(EventArgs e) {&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!Page.ClientScript.IsClientScriptBlockRegistered(JSCRIPT_NAME))&lt;/pre&gt;
&lt;pre class="alt"&gt;                Page.ClientScript.RegisterClientScriptBlock(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt;),&lt;/pre&gt;
&lt;pre&gt;                        JSCRIPT_NAME, AddJavaScriptToWebpart());&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Up to now we&amp;rsquo;ve met some of the user&amp;rsquo;s requirements but what about the GridView? Let&amp;rsquo;s talk about it then. The GridView is created by the following method&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; GridView GetSearchResultsGrid() {&lt;/pre&gt;
&lt;pre&gt;            GridView retval = &lt;span class="kwrd"&gt;new&lt;/span&gt; GridView() {&lt;/pre&gt;
&lt;pre class="alt"&gt;                ID = &lt;span class="str"&gt;&amp;quot;grdSearchResults&amp;quot;&lt;/span&gt;, AutoGenerateColumns = &lt;span class="kwrd"&gt;false&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;                AllowPaging = &lt;span class="kwrd"&gt;true&lt;/span&gt;, AllowSorting = &lt;span class="kwrd"&gt;true&lt;/span&gt;, Width = Unit.Percentage(100),&lt;/pre&gt;
&lt;pre class="alt"&gt;                PageSize = 100,&lt;/pre&gt;
&lt;pre&gt;                EmptyDataText=&lt;span class="str"&gt;&amp;quot;&amp;lt;font color=&amp;#39;red&amp;#39;&amp;gt;&amp;lt;b&amp;gt;No results found&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            };&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// Add Columns to the GridView&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            retval.Columns.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; BoundField() { DataField = &lt;span class="str"&gt;&amp;quot;sapSearch&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre class="alt"&gt;                                                  HeaderText = &lt;span class="str"&gt;&amp;quot;SAP Search&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;                                                  SortExpression = &lt;span class="str"&gt;&amp;quot;sapSearch&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            retval.Columns.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; BoundField() { DataField = &lt;span class="str"&gt;&amp;quot;accountNo&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre class="alt"&gt;                                                  HeaderText = &lt;span class="str"&gt;&amp;quot;Account No.&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre&gt;                                                  SortExpression = &lt;span class="str"&gt;&amp;quot;accountNo&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            retval.Columns.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; BoundField() { DataField = &lt;span class="str"&gt;&amp;quot;accountName&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre class="alt"&gt;                                                  HeaderText = &lt;span class="str"&gt;&amp;quot;Account Name&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre&gt;                                                  SortExpression = &lt;span class="str"&gt;&amp;quot;accountName&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;/pre&gt;
&lt;pre&gt;            retval.Columns.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; BoundField() { DataField = &lt;span class="str"&gt;&amp;quot;state&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre class="alt"&gt;                                                  HeaderText = &lt;span class="str"&gt;&amp;quot;State&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre&gt;                                                  SortExpression = &lt;span class="str"&gt;&amp;quot;state&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            retval.Columns.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; TemplateField() {&lt;/pre&gt;
&lt;pre class="alt"&gt;                ItemTemplate = &lt;span class="kwrd"&gt;new&lt;/span&gt; CheckBoxTemplate(ListItemType.Item),&lt;/pre&gt;
&lt;pre&gt;                HeaderTemplate = &lt;span class="kwrd"&gt;new&lt;/span&gt; CheckBoxTemplate(ListItemType.Header)&lt;/pre&gt;
&lt;pre class="alt"&gt;            });&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// Let&amp;#39;s align to the centre the Order Block and State Columns&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            retval.Columns[3].ItemStyle.HorizontalAlign = HorizontalAlign.Center;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.Columns[4].ItemStyle.HorizontalAlign = HorizontalAlign.Center;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// Subscribe to events&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            retval.Sorting += grdSearchResults_Sorting;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.RowCreated += grdSearchResults_RowCreated;&lt;/pre&gt;
&lt;pre&gt;            retval.PageIndexChanging += grdResults_PageIndexChanging;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.RowDataBound += grdSearchResults_RowDataBound;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;The ticking/unticking of the checkboxes is handled by a Javascript call from &lt;strong&gt;&lt;em&gt;CheckBoxTemplate &lt;/em&gt;&lt;/strong&gt;(attached to the post)&lt;strong&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/strong&gt; as shown below&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; CheckBox GetTemplateContents() {&lt;/pre&gt;
&lt;pre&gt;            CheckBox retval = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (_type) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; ListItemType.Header:&lt;/pre&gt;
&lt;pre&gt;                    retval = &lt;span class="kwrd"&gt;new&lt;/span&gt; CheckBox() { ID = &lt;span class="str"&gt;&amp;quot;chkHeader&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre class="alt"&gt;                                              Text = &lt;span class="str"&gt;&amp;quot;Account Block&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;                                              EnableViewState = &lt;span class="kwrd"&gt;true&lt;/span&gt; };&lt;/pre&gt;
&lt;pre class="alt"&gt;                    retval.Attributes[&lt;span class="str"&gt;&amp;quot;onclick&amp;quot;&lt;/span&gt;] = &lt;span class="str"&gt;&amp;quot;BLOCKED SCRIPTcheckUncheckHeader(this);&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; ListItemType.Item:&lt;/pre&gt;
&lt;pre&gt;                    retval = &lt;span class="kwrd"&gt;new&lt;/span&gt; CheckBox() {ID = &lt;span class="str"&gt;&amp;quot;chkItem_&amp;quot;&lt;/span&gt;, EnableViewState = &lt;span class="kwrd"&gt;true&lt;/span&gt; };&lt;/pre&gt;
&lt;pre class="alt"&gt;                    retval.Attributes[&lt;span class="str"&gt;&amp;quot;onclick&amp;quot;&lt;/span&gt;] = &lt;span class="str"&gt;&amp;quot;BLOCKED SCRIPTcheckUncheckItem(this);&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;As previously mentioned, our Gridview had to support paging and sorting plus display an indicator for the current sorting criteria so I had to handle the &lt;strong&gt;&lt;em&gt;RowCreated&lt;/em&gt;&lt;/strong&gt; event as depicted below&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; grdSearchResults_RowCreated(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, &lt;/pre&gt;
&lt;pre&gt;            GridViewRowEventArgs e) {&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; rowIndex = 0;&lt;/pre&gt;
&lt;pre class="alt"&gt;            DataView sorted = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; strSortedHeader = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;/pre&gt;
&lt;pre&gt;            &lt;span class="rem"&gt;// Header&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Row.RowType == DataControlRowType.Header) {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (TableCell tc &lt;span class="kwrd"&gt;in&lt;/span&gt; e.Row.Cells) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (tc.Controls.Count &amp;gt; 0 &amp;amp;&amp;amp; tc.Controls[0].GetType().ToString() == &lt;/pre&gt;
&lt;pre&gt;                           &lt;span class="str"&gt;&amp;quot;System.Web.UI.WebControls.DataControlLinkButton&amp;quot;&lt;/span&gt;) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                        strSortedHeader = ((LinkButton)tc.Controls[0]).Text;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="rem"&gt;// Sort indicator  (Webdings font does the job for us)&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (((LinkButton)tc.Controls[0]).CommandArgument ==&lt;/pre&gt;
&lt;pre class="alt"&gt;                            SortExpression) {&lt;/pre&gt;
&lt;pre&gt;                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (GridViewSortDirection == SortDirection.Descending)&lt;/pre&gt;
&lt;pre class="alt"&gt;                                ((LinkButton)tc.Controls[0]).Text = &lt;/pre&gt;
&lt;pre&gt;                                     strSortedHeader.Replace(strSortedHeader,&lt;/pre&gt;
&lt;pre class="alt"&gt;                                     strSortedHeader + &lt;span class="str"&gt;&amp;quot;&amp;lt;font face=&amp;#39;Webdings&amp;#39;&amp;gt;5&amp;lt;/font&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;                            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                                ((LinkButton)tc.Controls[0]).Text =&lt;/pre&gt;
&lt;pre&gt;                                    strSortedHeader.Replace(strSortedHeader, &lt;/pre&gt;
&lt;pre class="alt"&gt;                                    strSortedHeader + &lt;span class="str"&gt;&amp;quot;&amp;lt;font face=&amp;#39;Webdings&amp;#39;&amp;gt;6&amp;lt;/font&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;                        }&lt;/pre&gt;
&lt;pre class="alt"&gt;                    }&lt;/pre&gt;
&lt;pre&gt;                }&lt;/pre&gt;
&lt;pre class="alt"&gt;            } &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Row.RowType == DataControlRowType.DataRow) { &lt;span class="rem"&gt;// DataRow&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Row.Cells[e.Row.Cells.Count - 1].Controls.Count &amp;gt; 0 &amp;amp;&amp;amp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    SearchResults != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; SearchResults.Rows.Count &amp;gt; 0) {&lt;/pre&gt;
&lt;pre&gt;                    sorted = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataView(SearchResults);&lt;/pre&gt;
&lt;pre class="alt"&gt;                    sorted.Sort = GridViewSortCondition;&lt;/pre&gt;
&lt;pre&gt;                    rowIndex = e.Row.DataItemIndex;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    ((CheckBox)e.Row.Cells[e.Row.Cells.Count - 1].Controls[0]).ID += &lt;/pre&gt;
&lt;pre&gt;                        sorted[e.Row.DataItemIndex][&lt;span class="str"&gt;&amp;quot;accountNo&amp;quot;&lt;/span&gt;].ToString();&lt;/pre&gt;
&lt;pre class="alt"&gt;                    ((CheckBox)e.Row.Cells[e.Row.Cells.Count - 1].Controls[0]).&lt;/pre&gt;
&lt;pre&gt;                        Checked = (&lt;span class="kwrd"&gt;bool&lt;/span&gt;) sorted[e.Row.DataItemIndex][&lt;span class="str"&gt;&amp;quot;isSelected&amp;quot;&lt;/span&gt;];&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="rem"&gt;// Is it checked? (Non user interaction)&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (((CheckBox)e.Row.Cells[e.Row.Cells.Count - 1].&lt;/pre&gt;
&lt;pre&gt;                        Controls[0]).Checked)&lt;/pre&gt;
&lt;pre class="alt"&gt;                        SelectedCheckBoxes += &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0};&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;                            ((CheckBox)e.Row.Cells[e.Row.Cells.Count - 1].&lt;/pre&gt;
&lt;pre class="alt"&gt;                            Controls[0]).ClientID);&lt;/pre&gt;
&lt;pre&gt;                }&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Please note that we make a difference when creating/rendering the rows based on their type, for instance, the header is going to display an arrow to indicate sorting direction, otherwise we grab the values retrieved from the database (CRM) and change the checkboxes&amp;rsquo; ID on the fly, by adding the account number to it (this is required to keep track of the user selection).&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;At this moment you&amp;rsquo;ll be wondering about, where is this guy grabbing the values set already from the client side and calling CRM?&amp;nbsp; I&amp;rsquo;m pretty sure that many of you know the answer&amp;hellip; The button click event handler.&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnUpdate_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) {&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; rowIndex = 0;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; selectedCell = 0;&lt;/pre&gt;
&lt;pre&gt;            DataView sorted = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt;[] splitData = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; selectedControl = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre class="alt"&gt;            HiddenField clientSideSelection = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;            StringBuilder userSelection = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;
&lt;pre class="alt"&gt;            GridView grdSearchResults = FindControl(&lt;span class="str"&gt;&amp;quot;grdSearchResults&amp;quot;&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; GridView;&lt;/pre&gt;
&lt;pre&gt;            HiddenField checkboxes_cleared = FindControl(&lt;span class="str"&gt;&amp;quot;checkboxes_cleared&amp;quot;&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;/pre&gt;
&lt;pre class="alt"&gt;                                              HiddenField;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// Is there any data to continue?&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((SearchResults != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; SearchResults.Rows.Count &amp;gt; 0) &amp;amp;&amp;amp; &lt;/pre&gt;
&lt;pre class="alt"&gt;                (grdSearchResults != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; grdSearchResults.Rows.Count &amp;gt; 0)) {&lt;/pre&gt;
&lt;pre&gt;                &lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Let&amp;#39;s create a view to deal with the data as it is displayed&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                sorted = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataView(SearchResults);&lt;/pre&gt;
&lt;pre class="alt"&gt;                sorted.Sort = GridViewSortCondition;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Let&amp;#39;s sync both server and client checkboxes selection&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                ManageDeselectedItemsOnClientSide();&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="rem"&gt;// Should we combine client-side selection with data from the DB?&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; ((clientSideSelection = FindControl(&lt;span class="str"&gt;&amp;quot;selected_checkboxes&amp;quot;&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; HiddenField) != &lt;span class="kwrd"&gt;null&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;                                            &amp;amp;&amp;amp;  !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(clientSideSelection.Value)) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                    splitData = clientSideSelection.Value.Split(&lt;span class="str"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    var includeQuery = from checkBoxName &lt;span class="kwrd"&gt;in&lt;/span&gt; splitData.ToList()&lt;/pre&gt;
&lt;pre&gt;                                     .Where(controlName =&amp;gt; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(controlName) &amp;amp;&amp;amp; &lt;/pre&gt;
&lt;pre class="alt"&gt;                                             SelectedCheckBoxes.IndexOf(controlName) == -1 &amp;amp;&amp;amp;&lt;/pre&gt;
&lt;pre&gt;                                             controlName.IndexOf(&lt;span class="str"&gt;&amp;quot;_REMOVED&amp;quot;&lt;/span&gt;) == -1)&lt;/pre&gt;
&lt;pre class="alt"&gt;                                     select checkBoxName;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="rem"&gt;// Is there any item we must include?&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (includeQuery.ToList().Count &amp;gt; 0)&lt;/pre&gt;
&lt;pre class="alt"&gt;                        includeQuery.ToList().ForEach(controlToInclude =&amp;gt;&lt;/pre&gt;
&lt;pre&gt;                                             userSelection.Append(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0};&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre class="alt"&gt;                            controlToInclude.Substring(controlToInclude.IndexOf(&lt;span class="str"&gt;&amp;quot;chkItem&amp;quot;&lt;/span&gt;)))));&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="rem"&gt;// Let&amp;#39;s combine it with the information coming from the DB&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    userSelection.Append(SelectedCheckBoxes);&lt;/pre&gt;
&lt;pre class="alt"&gt;                } &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (checkboxes_cleared != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class="rem"&gt;// Has the user interacted with the UI? &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(checkboxes_cleared.Value)) &lt;/pre&gt;
&lt;pre class="alt"&gt;                    userSelection.Append(SelectedCheckBoxes);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Accounts to update&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                splitData = userSelection.ToString().Split(&lt;span class="str"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="rem"&gt;// We loop through the control names collection &lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// (by default, we unblock those unselected checkboxes)&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; checkBoxId &lt;span class="kwrd"&gt;in&lt;/span&gt; splitData) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                    rowIndex = 0;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (GridViewRow selectedRow &lt;span class="kwrd"&gt;in&lt;/span&gt; grdSearchResults.Rows) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                        selectedCell = selectedRow.Cells.Count - 1;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="rem"&gt;// Is it the right one?&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (selectedRow.Cells[selectedCell].Controls.Count &amp;gt; 0 &amp;amp;&amp;amp; &lt;/pre&gt;
&lt;pre&gt;                            selectedRow.Cells[selectedCell].Controls[0] &lt;span class="kwrd"&gt;is&lt;/span&gt; CheckBox) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                            selectedControl = ((CheckBox)selectedRow.Cells[selectedCell].Controls[0]).ID;&lt;/pre&gt;
&lt;pre&gt;                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (selectedControl.Equals(checkBoxId)) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                                &lt;span class="rem"&gt;// Account to block&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                                sorted[rowIndex][&lt;span class="str"&gt;&amp;quot;isSelected&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;                                &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;                            } &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!splitData.Contains(selectedControl)) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                                &lt;span class="rem"&gt;// Account to unblock (default behaviour)&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                                sorted[rowIndex][&lt;span class="str"&gt;&amp;quot;isSelected&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;                            }&lt;/pre&gt;
&lt;pre&gt;                        }&lt;/pre&gt;
&lt;pre class="alt"&gt;                        rowIndex++;&lt;/pre&gt;
&lt;pre&gt;                    }&lt;/pre&gt;
&lt;pre class="alt"&gt;                }&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Block/Unblock accounts based on the user&amp;#39;s selection&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                var accountsToProcess = from currentSelection &lt;span class="kwrd"&gt;in&lt;/span&gt; sorted.Table&lt;/pre&gt;
&lt;pre&gt;                                        .AsEnumerable()&lt;/pre&gt;
&lt;pre class="alt"&gt;                            select &lt;span class="kwrd"&gt;new&lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;                              AccountId = currentSelection[&lt;span class="str"&gt;&amp;quot;accountId&amp;quot;&lt;/span&gt;].ToString(),&lt;/pre&gt;
&lt;pre class="alt"&gt;                              IsSelected = (&lt;span class="kwrd"&gt;bool&lt;/span&gt;)currentSelection[&lt;span class="str"&gt;&amp;quot;isSelected&amp;quot;&lt;/span&gt;]&lt;/pre&gt;
&lt;pre&gt;                            };&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                accountsToProcess.ToList().ForEach(account =&amp;gt; &lt;/pre&gt;
&lt;pre class="alt"&gt;                    OrderBlockManagement.updateAccount(account.AccountId,&lt;/pre&gt;
&lt;pre&gt;                                                       account.IsSelected));&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="rem"&gt;// Let&amp;#39;s clear DB selection information&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                SelectedCheckBoxes = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Let&amp;#39;s reflect the changes on the UI&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                GridBindingHelper();&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;The final result is shown below&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/7455.Screenshot_5F00_051CA835.png"&gt;&lt;img height="397" width="785" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/2161.Screenshot_5F00_thumb_5F00_28F559C2.png" alt="Screenshot" border="0" title="Screenshot" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Our webpart integrating different systems as mentioned at the beginning of this post plus providing a responsive UI to the user.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1725648" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Agregando procesamiento del lado-cliente a nuestros Webparts</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/09/22/agregando-procesamiento-del-lado-cliente-a-nuestros-webparts.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="3324" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.72.56.42/Code.zip" /><id>/blogs/angelhernandez/archive/2009/09/22/agregando-procesamiento-del-lado-cliente-a-nuestros-webparts.aspx</id><published>2009-09-22T05:44:00Z</published><updated>2009-09-22T05:44:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hace un par de semanas atr&amp;aacute;s estaba atendiendo y presentando en&amp;nbsp; &lt;a href="http://www.msteched.com/australia/Public/default.aspx"&gt;Microsoft TechEd&lt;/a&gt; en Gold Coast, cuando de repente recib&amp;iacute; una llamada del Gerente de Mercadeo y Ventas. &lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;La misi&amp;oacute;n&lt;/span&gt;&lt;/strong&gt;: Desarrollar un nuevo webpart para un portal &lt;a href="http://en.wikipedia.org/wiki/Business-to-business"&gt;B2B&lt;/a&gt; existente que integra &lt;a href="http://www.sap.com"&gt;SAP&lt;/a&gt;, &lt;a href="http://www-01.ibm.com/software/integration/wmq/"&gt;MQ&lt;/a&gt;, &lt;a href="http://crm.dynamics.com/"&gt;CRM&lt;/a&gt; y &lt;a href="http://www.softwareag.com/"&gt;webMethods&lt;/a&gt; a trav&amp;eacute;s &lt;a href="http://sharepoint.microsoft.com/Pages/Default.aspx"&gt;SharePoint&lt;/a&gt;. &lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;El reto:&lt;/span&gt;&lt;/strong&gt; Escribir c&amp;oacute;digo en Javascript para luego realizar operaciones del lado del servidor en base a la selecci&amp;oacute;n realizada por el usuario.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;He estado desarrollando para SharePoint por un rato ya, pero si sabes como hacer las cosas con &lt;a href="http://asp.net"&gt;ASP.NET&lt;/a&gt; entonces no es d&amp;iacute;ficil utilizar ese conocimiento y aplicarlos con SharePoint. Los requerimientos eran : &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Permitir la entrada del usuario y validar del lado del navegador &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Agregar AJAX para ofrecer una interfaz r&amp;aacute;pida a los usuarios&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Obtener informaci&amp;oacute;n almacenada del lado del cliente (navegador) desde el lado del servidor para realizar operaciones contra CRM&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;As&amp;iacute; que comencemos por el principio explicando como lo hice &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Propiedades requeridas&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; DataTable SearchResults {&lt;/pre&gt;
&lt;pre&gt;            get {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;p&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; (ViewState[&lt;span class="str"&gt;&amp;quot;block_orders&amp;quot;&lt;/span&gt;] != &lt;span class="kwrd"&gt;null&lt;/span&gt; ?&lt;br /&gt;                 (DataTable)ViewState[&lt;span class="str"&gt;&amp;quot;block_orders&amp;quot;&lt;/span&gt;] : &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/p&gt;&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;            set {&lt;/pre&gt;
&lt;pre&gt;                ViewState[&lt;span class="str"&gt;&amp;quot;block_orders&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;         &lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GridViewSortCondition {&lt;/pre&gt;
&lt;pre class="alt"&gt;            get {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (ViewState[&lt;span class="str"&gt;&amp;quot;SortCondition&amp;quot;&lt;/span&gt;] == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;                    ViewState[&lt;span class="str"&gt;&amp;quot;SortCondition&amp;quot;&lt;/span&gt;] = &lt;span class="str"&gt;&amp;quot;sapSearch ASC&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; ViewState[&lt;span class="str"&gt;&amp;quot;SortCondition&amp;quot;&lt;/span&gt;].ToString();&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;            set {&lt;/pre&gt;
&lt;pre&gt;                ViewState[&lt;span class="str"&gt;&amp;quot;SortCondition&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; SortDirection GridViewSortDirection {&lt;/pre&gt;
&lt;pre class="alt"&gt;            get {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (ViewState[&lt;span class="str"&gt;&amp;quot;SortDirection&amp;quot;&lt;/span&gt;] == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;                    ViewState[&lt;span class="str"&gt;&amp;quot;SortDirection&amp;quot;&lt;/span&gt;] = SortDirection.Ascending;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; (SortDirection)ViewState[&lt;span class="str"&gt;&amp;quot;SortDirection&amp;quot;&lt;/span&gt;];&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;            set {&lt;/pre&gt;
&lt;pre&gt;                ViewState[&lt;span class="str"&gt;&amp;quot;SortDirection&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; SortExpression {&lt;/pre&gt;
&lt;pre class="alt"&gt;            get {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; (ViewState[&lt;span class="str"&gt;&amp;quot;sort_exp&amp;quot;&lt;/span&gt;] != &lt;span class="kwrd"&gt;null&lt;/span&gt; ?&lt;/pre&gt;
&lt;pre&gt;                  ViewState[&lt;span class="str"&gt;&amp;quot;sort_exp&amp;quot;&lt;/span&gt;].ToString() : &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty);&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;            set {&lt;/pre&gt;
&lt;pre class="alt"&gt;                ViewState[&lt;span class="str"&gt;&amp;quot;sort_exp&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; SelectedCheckBoxes {&lt;/pre&gt;
&lt;pre&gt;            get {&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; (ViewState[&lt;span class="str"&gt;&amp;quot;selected_check_boxes&amp;quot;&lt;/span&gt;] != &lt;span class="kwrd"&gt;null&lt;/span&gt; ?&lt;/pre&gt;
&lt;pre&gt;                    ViewState[&lt;span class="str"&gt;&amp;quot;selected_check_boxes&amp;quot;&lt;/span&gt;].ToString() : &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty);&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;            set {&lt;/pre&gt;
&lt;pre class="alt"&gt;                ViewState[&lt;span class="str"&gt;&amp;quot;selected_check_boxes&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Necesito guardar los resultados de la b&amp;uacute;squeda para que el usuario pueda paginar y ordenar estos &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Ahora, prosigamos con el c&amp;oacute;digo requerido para agregar AJAX, en mi caso siempre separo/distribuyo el c&amp;oacute;digo que genera la interfaz de usuario en partes, es decir, tengo un m&amp;eacute;todo para generar la parte superior, media e inferior del webpart y como estoy implementando AJAX me gusta encerrar todo dentro de un&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Span_and_div"&gt;&amp;lt;DIV&amp;gt;&lt;/a&gt; por lo que el c&amp;oacute;digo requerido es como &amp;eacute;ste&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddAJAXControls() {&lt;/pre&gt;
&lt;pre&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Literal() { Text = &lt;span class="str"&gt;&amp;quot;&amp;lt;div&amp;gt;&amp;quot;&lt;/span&gt;, ID = &lt;span class="str"&gt;&amp;quot;mainDiv&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; ScriptManager() { ID = &lt;span class="str"&gt;&amp;quot;scriptManager_OrderBlock&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Literal() { Text = InjectScriptToDisableDoublePostBack() });&lt;/pre&gt;
&lt;pre class="alt"&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; UpdatePanel() { ID = &lt;span class="str"&gt;&amp;quot;updatePanel_OrderBlock&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Por favor n&amp;oacute;tese la llamada al m&amp;eacute;todo &lt;strong&gt;&lt;em&gt;&amp;ldquo;InjectScriptToDisableDoublePostback&amp;rdquo;&lt;/em&gt;&lt;/strong&gt;, el cu&amp;aacute;l es responsable de deshabilitar el control que gener&amp;oacute; el&amp;nbsp; postback (por ejemplo, un bot&amp;oacute;n enviar) as&amp;iacute; evito que el usuario lo presione m&amp;aacute;s de una vez, el c&amp;oacute;digo es mostrado abajo&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; InjectScriptToDisableDoublePostBack() {&lt;/pre&gt;
&lt;pre&gt;            StringBuilder retval = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;&amp;lt;script type=&amp;#39;text/javascript&amp;#39;&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;var pbControl = null;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;var prm = Sys.WebForms.PageRequestManager.getInstance();&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;prm.add_beginRequest(BeginRequestHandler);&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;prm.add_endRequest(EndRequestHandler);&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;function BeginRequestHandler(sender, args) {&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;//the control causing the postback&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;pbControl = args.get_postBackElement();&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;if (pbControl.id.indexOf(&amp;#39;btnSearch&amp;#39;) &amp;gt; -1 || &amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;pbControl.id.indexOf(&amp;#39;btnUpdate&amp;#39;) &amp;gt; -1 )&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;pbControl.disabled = true;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;function EndRequestHandler(sender, args) {&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;pbControl.disabled = false;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;pbControl = null;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            retval.AppendLine(&lt;span class="str"&gt;&amp;quot;&amp;lt;/script&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; retval.ToString();&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;El m&amp;eacute;todo responsable de poner todas las piezas juntas y dibujar el webpart es &lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CreateUI() {&lt;/pre&gt;
&lt;pre&gt;            UpdatePanel panel = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="rem"&gt;// Add AJAX controls&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            AddAJAXControls();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((panel = FindControl(&lt;span class="str"&gt;&amp;quot;updatePanel_OrderBlock&amp;quot;&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; UpdatePanel) != &lt;span class="kwrd"&gt;null&lt;/span&gt;) {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="rem"&gt;// Top Table&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                panel.ContentTemplateContainer.Controls.Add(GetTopTable());&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Bottom Table&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                panel.ContentTemplateContainer.Controls.Add(GetBottomTable());&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="rem"&gt;// Close Div containing AJAX controls&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Literal() { Text = &lt;span class="str"&gt;&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Este m&amp;eacute;todo me genera un HTML limpio y ordenado cuando el webpart es dibujado adem&amp;aacute;s es f&amp;aacute;cil de seguir, depurar y mantener. Ahora, todos los objetos requeridos est&amp;aacute;n dentro del &amp;lt;DIV&amp;gt;&amp;nbsp; y ya agregu&amp;eacute; AJAX&amp;hellip; La &amp;uacute;nica cosa que me falta es nuestra plantilla de progreso (c&amp;oacute;digo adjunto) que utiliza un GIF animado que viene con&amp;nbsp; SharePoint.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;            Table retval = &lt;span class="kwrd"&gt;new&lt;/span&gt; Table() {&lt;/pre&gt;
&lt;pre&gt;                ID = &lt;span class="str"&gt;&amp;quot;tblTopTable&amp;quot;&lt;/span&gt;, CellPadding = 1,&lt;/pre&gt;
&lt;pre class="alt"&gt;                CellSpacing = 0, Width = Unit.Percentage(100)&lt;/pre&gt;
&lt;pre&gt;            };&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            retval.Rows.AddRange(&lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow[] {&lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(), &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(), &lt;/pre&gt;
&lt;pre class="alt"&gt;                                                 &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(), &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(),&lt;/pre&gt;
&lt;pre&gt;                                                 &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(), &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(),&lt;/pre&gt;
&lt;pre class="alt"&gt;                                                 &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(), &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow(),&lt;/pre&gt;
&lt;pre&gt;                                                 &lt;span class="kwrd"&gt;new&lt;/span&gt; TableRow()});&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.Rows[ 8 ].Cells.AddRange(&lt;span class="kwrd"&gt;new&lt;/span&gt; TableCell[] { &lt;span class="kwrd"&gt;new&lt;/span&gt; TableCell() {&lt;/pre&gt;
&lt;pre&gt;                                                 Width=Unit.Percentage(20)}, &lt;/pre&gt;
&lt;pre class="alt"&gt;                                                            &lt;span class="kwrd"&gt;new&lt;/span&gt; TableCell() {&lt;/pre&gt;
&lt;pre&gt;                                                 Width=Unit.Percentage(60)}});&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="rem"&gt;// Update Progress&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.Rows[ 8 ].Cells[0].ColumnSpan = 2;&lt;/pre&gt;
&lt;pre&gt;            retval.Rows[ 8 ].Cells[0].HorizontalAlign = HorizontalAlign.Left;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.Rows[ 8 ].Cells[0].Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; UpdateProgress() {&lt;/pre&gt;
&lt;pre&gt;                ID = &lt;span class="str"&gt;&amp;quot;workProgress&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre class="alt"&gt;                ProgressTemplate = &lt;span class="kwrd"&gt;new&lt;/span&gt; UpdateProgressTemplate()&lt;/pre&gt;
&lt;pre&gt;            });&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Bueno&amp;hellip; hasta ahora tenemos el AJAX trabajando con nuestro webpart pero, &amp;iquest;qu&amp;eacute; es lo especial de eso? Bien... no mucho en realidad pero ahora necesitamos sincronizar la selecci&amp;oacute;n realizada por el usuario del lado del cliente y reflejar estos cambios del lado del servidor, as&amp;iacute; que para lograr eso necesitamos escribir unos scripts (c&amp;oacute;digo adjunto) y un par de campos ocultos que son referenciados desde nuestro c&amp;oacute;digo en JavaScript y del webpart tambi&amp;eacute;n, por lo que en aras de mantener las cosas ordenadas y simples, agregamos estos a la colecci&amp;oacute;n de controles del webpart una vez que ya hemos creado todo lo dem&amp;aacute;s&amp;nbsp; (como se muestra abajo)&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CreateChildControls() {&lt;/pre&gt;
&lt;pre&gt;            CreateUI();&lt;/pre&gt;
&lt;pre class="alt"&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; HiddenField() { ID = &lt;span class="str"&gt;&amp;quot;selected_checkboxes&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre&gt;                                             EnableViewState = &lt;span class="kwrd"&gt;true&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;            Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; HiddenField() { ID = &lt;span class="str"&gt;&amp;quot;checkboxes_cleared&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;                                             EnableViewState = &lt;span class="kwrd"&gt;true&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;            ChildControlsCreated = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Tambi&amp;eacute;n necesitamos agregar JavaScript para soportar operaciones del lado del cliente por lo que sobrescribimos el m&amp;eacute;todo&amp;nbsp; &lt;strong&gt;&lt;em&gt;OnPreRender&lt;/em&gt;&lt;/strong&gt;&amp;nbsp; (El m&amp;eacute;todo AddJavaScriptToWebpart est&amp;aacute; adjunto a este post)&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnPreRender(EventArgs e) {&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!Page.ClientScript.IsClientScriptBlockRegistered(JSCRIPT_NAME))&lt;/pre&gt;
&lt;pre class="alt"&gt;                Page.ClientScript.RegisterClientScriptBlock(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt;),&lt;/pre&gt;
&lt;pre&gt;                        JSCRIPT_NAME, AddJavaScriptToWebpart());&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hasta ahora hemos satisfecho algunos de los requerimientos solicitados por el usuario, pero &amp;iquest;qu&amp;eacute; pas&amp;oacute; con el&amp;nbsp; GridView? Hablemos del GridView entonces. El GridView es creado por el siguiente m&amp;eacute;todo &lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; GridView GetSearchResultsGrid() {&lt;/pre&gt;
&lt;pre&gt;            GridView retval = &lt;span class="kwrd"&gt;new&lt;/span&gt; GridView() {&lt;/pre&gt;
&lt;pre class="alt"&gt;                ID = &lt;span class="str"&gt;&amp;quot;grdSearchResults&amp;quot;&lt;/span&gt;, AutoGenerateColumns = &lt;span class="kwrd"&gt;false&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;                AllowPaging = &lt;span class="kwrd"&gt;true&lt;/span&gt;, AllowSorting = &lt;span class="kwrd"&gt;true&lt;/span&gt;, Width = Unit.Percentage(100),&lt;/pre&gt;
&lt;pre class="alt"&gt;                PageSize = 100,&lt;/pre&gt;
&lt;pre&gt;                EmptyDataText=&lt;span class="str"&gt;&amp;quot;&amp;lt;font color=&amp;#39;red&amp;#39;&amp;gt;&amp;lt;b&amp;gt;No results found&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            };&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// Add Columns to the GridView&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            retval.Columns.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; BoundField() { DataField = &lt;span class="str"&gt;&amp;quot;sapSearch&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre class="alt"&gt;                                                  HeaderText = &lt;span class="str"&gt;&amp;quot;SAP Search&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;                                                  SortExpression = &lt;span class="str"&gt;&amp;quot;sapSearch&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            retval.Columns.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; BoundField() { DataField = &lt;span class="str"&gt;&amp;quot;accountNo&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre class="alt"&gt;                                                  HeaderText = &lt;span class="str"&gt;&amp;quot;Account No.&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre&gt;                                                  SortExpression = &lt;span class="str"&gt;&amp;quot;accountNo&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            retval.Columns.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; BoundField() { DataField = &lt;span class="str"&gt;&amp;quot;accountName&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre class="alt"&gt;                                                  HeaderText = &lt;span class="str"&gt;&amp;quot;Account Name&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre&gt;                                                  SortExpression = &lt;span class="str"&gt;&amp;quot;accountName&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;/pre&gt;
&lt;pre&gt;            retval.Columns.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; BoundField() { DataField = &lt;span class="str"&gt;&amp;quot;state&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre class="alt"&gt;                                                  HeaderText = &lt;span class="str"&gt;&amp;quot;State&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre&gt;                                                  SortExpression = &lt;span class="str"&gt;&amp;quot;state&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            retval.Columns.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; TemplateField() {&lt;/pre&gt;
&lt;pre class="alt"&gt;                ItemTemplate = &lt;span class="kwrd"&gt;new&lt;/span&gt; CheckBoxTemplate(ListItemType.Item),&lt;/pre&gt;
&lt;pre&gt;                HeaderTemplate = &lt;span class="kwrd"&gt;new&lt;/span&gt; CheckBoxTemplate(ListItemType.Header)&lt;/pre&gt;
&lt;pre class="alt"&gt;            });&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// Let&amp;#39;s align to the centre the Order Block and State Columns&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            retval.Columns[3].ItemStyle.HorizontalAlign = HorizontalAlign.Center;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.Columns[4].ItemStyle.HorizontalAlign = HorizontalAlign.Center;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// Subscribe to events&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            retval.Sorting += grdSearchResults_Sorting;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.RowCreated += grdSearchResults_RowCreated;&lt;/pre&gt;
&lt;pre&gt;            retval.PageIndexChanging += grdResults_PageIndexChanging;&lt;/pre&gt;
&lt;pre class="alt"&gt;            retval.RowDataBound += grdSearchResults_RowDataBound;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;La selecci&amp;oacute;n/de-selecci&amp;oacute;n de las casillas de verificaci&amp;oacute;n es manejado por una llamada a una funci&amp;oacute;n en JavaScript, realizada desde&amp;nbsp; &lt;strong&gt;&lt;em&gt;CheckBoxTemplate &lt;/em&gt;&lt;/strong&gt;(adjunto al post)&lt;strong&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/strong&gt;como es mostrado abajo&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; CheckBox GetTemplateContents() {&lt;/pre&gt;
&lt;pre&gt;            CheckBox retval = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (_type) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; ListItemType.Header:&lt;/pre&gt;
&lt;pre&gt;                    retval = &lt;span class="kwrd"&gt;new&lt;/span&gt; CheckBox() { ID = &lt;span class="str"&gt;&amp;quot;chkHeader&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre class="alt"&gt;                                              Text = &lt;span class="str"&gt;&amp;quot;Account Block&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;                                              EnableViewState = &lt;span class="kwrd"&gt;true&lt;/span&gt; };&lt;/pre&gt;
&lt;pre class="alt"&gt;                    retval.Attributes[&lt;span class="str"&gt;&amp;quot;onclick&amp;quot;&lt;/span&gt;] = &lt;span class="str"&gt;&amp;quot;BLOCKED SCRIPTcheckUncheckHeader(this);&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; ListItemType.Item:&lt;/pre&gt;
&lt;pre&gt;                    retval = &lt;span class="kwrd"&gt;new&lt;/span&gt; CheckBox() {ID = &lt;span class="str"&gt;&amp;quot;chkItem_&amp;quot;&lt;/span&gt;, EnableViewState = &lt;span class="kwrd"&gt;true&lt;/span&gt; };&lt;/pre&gt;
&lt;pre class="alt"&gt;                    retval.Attributes[&lt;span class="str"&gt;&amp;quot;onclick&amp;quot;&lt;/span&gt;] = &lt;span class="str"&gt;&amp;quot;BLOCKED SCRIPTcheckUncheckItem(this);&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Como mencionamos previamente, nuestro GridVied ten&amp;iacute;a que soportar paginaci&amp;oacute;n y ordenamiento adem&amp;aacute;s de mostrar un indicador para el criterio de ordenamiento actual as&amp;iacute; que tuve que manejar el evento &lt;strong&gt;&lt;em&gt;RowCreated&lt;/em&gt;&lt;/strong&gt; event como se muestra a continuaci&amp;oacute;n&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; grdSearchResults_RowCreated(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, &lt;/pre&gt;
&lt;pre&gt;            GridViewRowEventArgs e) {&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; rowIndex = 0;&lt;/pre&gt;
&lt;pre class="alt"&gt;            DataView sorted = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; strSortedHeader = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;/pre&gt;
&lt;pre&gt;            &lt;span class="rem"&gt;// Header&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Row.RowType == DataControlRowType.Header) {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (TableCell tc &lt;span class="kwrd"&gt;in&lt;/span&gt; e.Row.Cells) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (tc.Controls.Count &amp;gt; 0 &amp;amp;&amp;amp; tc.Controls[0].GetType().ToString() == &lt;/pre&gt;
&lt;pre&gt;                           &lt;span class="str"&gt;&amp;quot;System.Web.UI.WebControls.DataControlLinkButton&amp;quot;&lt;/span&gt;) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                        strSortedHeader = ((LinkButton)tc.Controls[0]).Text;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="rem"&gt;// Sort indicator  (Webdings font does the job for us)&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (((LinkButton)tc.Controls[0]).CommandArgument ==&lt;/pre&gt;
&lt;pre class="alt"&gt;                            SortExpression) {&lt;/pre&gt;
&lt;pre&gt;                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (GridViewSortDirection == SortDirection.Descending)&lt;/pre&gt;
&lt;pre class="alt"&gt;                                ((LinkButton)tc.Controls[0]).Text = &lt;/pre&gt;
&lt;pre&gt;                                     strSortedHeader.Replace(strSortedHeader,&lt;/pre&gt;
&lt;pre class="alt"&gt;                                     strSortedHeader + &lt;span class="str"&gt;&amp;quot;&amp;lt;font face=&amp;#39;Webdings&amp;#39;&amp;gt;5&amp;lt;/font&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;                            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                                ((LinkButton)tc.Controls[0]).Text =&lt;/pre&gt;
&lt;pre&gt;                                    strSortedHeader.Replace(strSortedHeader, &lt;/pre&gt;
&lt;pre class="alt"&gt;                                    strSortedHeader + &lt;span class="str"&gt;&amp;quot;&amp;lt;font face=&amp;#39;Webdings&amp;#39;&amp;gt;6&amp;lt;/font&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;                        }&lt;/pre&gt;
&lt;pre class="alt"&gt;                    }&lt;/pre&gt;
&lt;pre&gt;                }&lt;/pre&gt;
&lt;pre class="alt"&gt;            } &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Row.RowType == DataControlRowType.DataRow) { &lt;span class="rem"&gt;// DataRow&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Row.Cells[e.Row.Cells.Count - 1].Controls.Count &amp;gt; 0 &amp;amp;&amp;amp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    SearchResults != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; SearchResults.Rows.Count &amp;gt; 0) {&lt;/pre&gt;
&lt;pre&gt;                    sorted = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataView(SearchResults);&lt;/pre&gt;
&lt;pre class="alt"&gt;                    sorted.Sort = GridViewSortCondition;&lt;/pre&gt;
&lt;pre&gt;                    rowIndex = e.Row.DataItemIndex;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    ((CheckBox)e.Row.Cells[e.Row.Cells.Count - 1].Controls[0]).ID += &lt;/pre&gt;
&lt;pre&gt;                        sorted[e.Row.DataItemIndex][&lt;span class="str"&gt;&amp;quot;accountNo&amp;quot;&lt;/span&gt;].ToString();&lt;/pre&gt;
&lt;pre class="alt"&gt;                    ((CheckBox)e.Row.Cells[e.Row.Cells.Count - 1].Controls[0]).&lt;/pre&gt;
&lt;pre&gt;                        Checked = (&lt;span class="kwrd"&gt;bool&lt;/span&gt;) sorted[e.Row.DataItemIndex][&lt;span class="str"&gt;&amp;quot;isSelected&amp;quot;&lt;/span&gt;];&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="rem"&gt;// Is it checked? (Non user interaction)&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (((CheckBox)e.Row.Cells[e.Row.Cells.Count - 1].&lt;/pre&gt;
&lt;pre&gt;                        Controls[0]).Checked)&lt;/pre&gt;
&lt;pre class="alt"&gt;                        SelectedCheckBoxes += &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0};&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;                            ((CheckBox)e.Row.Cells[e.Row.Cells.Count - 1].&lt;/pre&gt;
&lt;pre class="alt"&gt;                            Controls[0]).ClientID);&lt;/pre&gt;
&lt;pre&gt;                }&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Por favor, n&amp;oacute;tese la diferencia cuando se est&amp;aacute; creando/dibujando las filas basadas en su tipo, es decir, el encabezado va a mostrar una flecha que indica la direcci&amp;oacute;n de ordenamiento, de lo contrario, tomamos los valores recuperados de la base de datos (CRM) y cambiamos el ID de las casillas de verificaci&amp;oacute;n en tiempo de ejecuci&amp;oacute;n, al agregar el n&amp;uacute;mero de cuenta a &amp;eacute;ste (esto es requerido para hacer seguimiento de la selecci&amp;oacute;n del usuario) &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;En este momento se estar&amp;aacute;n preguntando, &amp;iquest;en donde se toman los valores almacenados del lado del cliente y se llama a CRM? Estoy seguro que muchos saben la respuesta&amp;hellip; El manejador del evento click del bot&amp;oacute;n. &lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnUpdate_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) {&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; rowIndex = 0;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; selectedCell = 0;&lt;/pre&gt;
&lt;pre&gt;            DataView sorted = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt;[] splitData = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; selectedControl = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre class="alt"&gt;            HiddenField clientSideSelection = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;            StringBuilder userSelection = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;
&lt;pre class="alt"&gt;            GridView grdSearchResults = FindControl(&lt;span class="str"&gt;&amp;quot;grdSearchResults&amp;quot;&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; GridView;&lt;/pre&gt;
&lt;pre&gt;            HiddenField checkboxes_cleared = FindControl(&lt;span class="str"&gt;&amp;quot;checkboxes_cleared&amp;quot;&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;/pre&gt;
&lt;pre class="alt"&gt;                                              HiddenField;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// Is there any data to continue?&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((SearchResults != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; SearchResults.Rows.Count &amp;gt; 0) &amp;amp;&amp;amp; &lt;/pre&gt;
&lt;pre class="alt"&gt;                (grdSearchResults != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; grdSearchResults.Rows.Count &amp;gt; 0)) {&lt;/pre&gt;
&lt;pre&gt;                &lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Let&amp;#39;s create a view to deal with the data as it is displayed&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                sorted = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataView(SearchResults);&lt;/pre&gt;
&lt;pre class="alt"&gt;                sorted.Sort = GridViewSortCondition;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Let&amp;#39;s sync both server and client checkboxes selection&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                ManageDeselectedItemsOnClientSide();&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="rem"&gt;// Should we combine client-side selection with data from the DB?&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; ((clientSideSelection = FindControl(&lt;span class="str"&gt;&amp;quot;selected_checkboxes&amp;quot;&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; HiddenField) != &lt;span class="kwrd"&gt;null&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;                                            &amp;amp;&amp;amp;  !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(clientSideSelection.Value)) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                    splitData = clientSideSelection.Value.Split(&lt;span class="str"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    var includeQuery = from checkBoxName &lt;span class="kwrd"&gt;in&lt;/span&gt; splitData.ToList()&lt;/pre&gt;
&lt;pre&gt;                                     .Where(controlName =&amp;gt; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(controlName) &amp;amp;&amp;amp; &lt;/pre&gt;
&lt;pre class="alt"&gt;                                             SelectedCheckBoxes.IndexOf(controlName) == -1 &amp;amp;&amp;amp;&lt;/pre&gt;
&lt;pre&gt;                                             controlName.IndexOf(&lt;span class="str"&gt;&amp;quot;_REMOVED&amp;quot;&lt;/span&gt;) == -1)&lt;/pre&gt;
&lt;pre class="alt"&gt;                                     select checkBoxName;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="rem"&gt;// Is there any item we must include?&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (includeQuery.ToList().Count &amp;gt; 0)&lt;/pre&gt;
&lt;pre class="alt"&gt;                        includeQuery.ToList().ForEach(controlToInclude =&amp;gt;&lt;/pre&gt;
&lt;pre&gt;                                             userSelection.Append(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0};&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre class="alt"&gt;                            controlToInclude.Substring(controlToInclude.IndexOf(&lt;span class="str"&gt;&amp;quot;chkItem&amp;quot;&lt;/span&gt;)))));&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="rem"&gt;// Let&amp;#39;s combine it with the information coming from the DB&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    userSelection.Append(SelectedCheckBoxes);&lt;/pre&gt;
&lt;pre class="alt"&gt;                } &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (checkboxes_cleared != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class="rem"&gt;// Has the user interacted with the UI? &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(checkboxes_cleared.Value)) &lt;/pre&gt;
&lt;pre class="alt"&gt;                    userSelection.Append(SelectedCheckBoxes);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Accounts to update&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                splitData = userSelection.ToString().Split(&lt;span class="str"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="rem"&gt;// We loop through the control names collection &lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// (by default, we unblock those unselected checkboxes)&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; checkBoxId &lt;span class="kwrd"&gt;in&lt;/span&gt; splitData) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                    rowIndex = 0;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (GridViewRow selectedRow &lt;span class="kwrd"&gt;in&lt;/span&gt; grdSearchResults.Rows) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                        selectedCell = selectedRow.Cells.Count - 1;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="rem"&gt;// Is it the right one?&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (selectedRow.Cells[selectedCell].Controls.Count &amp;gt; 0 &amp;amp;&amp;amp; &lt;/pre&gt;
&lt;pre&gt;                            selectedRow.Cells[selectedCell].Controls[0] &lt;span class="kwrd"&gt;is&lt;/span&gt; CheckBox) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                            selectedControl = ((CheckBox)selectedRow.Cells[selectedCell].Controls[0]).ID;&lt;/pre&gt;
&lt;pre&gt;                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (selectedControl.Equals(checkBoxId)) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                                &lt;span class="rem"&gt;// Account to block&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                                sorted[rowIndex][&lt;span class="str"&gt;&amp;quot;isSelected&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;                                &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;                            } &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!splitData.Contains(selectedControl)) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                                &lt;span class="rem"&gt;// Account to unblock (default behaviour)&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                                sorted[rowIndex][&lt;span class="str"&gt;&amp;quot;isSelected&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;                            }&lt;/pre&gt;
&lt;pre&gt;                        }&lt;/pre&gt;
&lt;pre class="alt"&gt;                        rowIndex++;&lt;/pre&gt;
&lt;pre&gt;                    }&lt;/pre&gt;
&lt;pre class="alt"&gt;                }&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Block/Unblock accounts based on the user&amp;#39;s selection&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                var accountsToProcess = from currentSelection &lt;span class="kwrd"&gt;in&lt;/span&gt; sorted.Table&lt;/pre&gt;
&lt;pre&gt;                                        .AsEnumerable()&lt;/pre&gt;
&lt;pre class="alt"&gt;                            select &lt;span class="kwrd"&gt;new&lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;                              AccountId = currentSelection[&lt;span class="str"&gt;&amp;quot;accountId&amp;quot;&lt;/span&gt;].ToString(),&lt;/pre&gt;
&lt;pre class="alt"&gt;                              IsSelected = (&lt;span class="kwrd"&gt;bool&lt;/span&gt;)currentSelection[&lt;span class="str"&gt;&amp;quot;isSelected&amp;quot;&lt;/span&gt;]&lt;/pre&gt;
&lt;pre&gt;                            };&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                accountsToProcess.ToList().ForEach(account =&amp;gt; &lt;/pre&gt;
&lt;pre class="alt"&gt;                    OrderBlockManagement.updateAccount(account.AccountId,&lt;/pre&gt;
&lt;pre&gt;                                                       account.IsSelected));&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="rem"&gt;// Let&amp;#39;s clear DB selection information&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                SelectedCheckBoxes = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// Let&amp;#39;s reflect the changes on the UI&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                GridBindingHelper();&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;El resultado final es mostrado abajo &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/1513.Screenshot_5F00_3CC192D1.png"&gt;&lt;img height="381" width="780" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6874.Screenshot_5F00_thumb_5F00_19B12161.png" alt="Screenshot" border="0" title="Screenshot" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Nuestro webpart integrando diferentes sistemas como mencion&amp;eacute; al principio del post adem&amp;aacute;s de proveer una interfaz r&amp;aacute;pida al usuario.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1725642" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Slide deck and demos for Break Out Session at Tech-Ed / Láminas y demos utilizados para mi sesión en Tech-Ed</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/09/13/slide-deck-and-demos-for-break-out-session-at-tech-ed-l-225-minas-y-demos-utilizados-para-mi-sesi-243-n-en-tech-ed.aspx" /><id>/blogs/angelhernandez/archive/2009/09/13/slide-deck-and-demos-for-break-out-session-at-tech-ed-l-225-minas-y-demos-utilizados-para-mi-sesi-243-n-en-tech-ed.aspx</id><published>2009-09-13T06:41:00Z</published><updated>2009-09-13T06:41:00Z</updated><content type="html">&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;img src="http://blogs.technet.com/blogfiles/jeffa36/WindowsLiveWriter/TechEdAustraliaFreeNetbookonoffer_C2B3/teched200901_3.png" border="0" style="max-height:205px;max-width:240px;" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Hi Community,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Please feel free to download the slide deck and demos for my break out session at Tech-Ed&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Hola Comunidad,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Por favor si&amp;eacute;ntanse libres de&amp;nbsp;&amp;nbsp;descargar las l&amp;aacute;minas y demos de mi sesi&amp;oacute;n en Tech-Ed&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;a href="http://www.msteched.com/online/view.aspx?tid=49e91c5d-7fd8-41a7-bf3d-17ce5e32337b"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe scrolling="no" frameborder="0" src="http://cid-2fe1291768841ace.skydrive.live.com/embedicon.aspx/Community/SOA342.zip" title="Preview" style="background-color:#fcfcfc;width:98px;height:115px;padding:0px;"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1722944" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Tech Talk on "Windows API Code Pack for .NET" / Charla Técnica sobre "Windows API Code Pack for .NET"</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/09/11/tech-talk-on-quot-windows-api-code-pack-for-net-quot-charla-t-233-cnica-sobre-quot-windows-api-code-pack-for-net-quot.aspx" /><id>/blogs/angelhernandez/archive/2009/09/11/tech-talk-on-quot-windows-api-code-pack-for-net-quot-charla-t-233-cnica-sobre-quot-windows-api-code-pack-for-net-quot.aspx</id><published>2009-09-11T03:12:00Z</published><updated>2009-09-11T03:12:00Z</updated><content type="html">&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;img src="http://blogs.technet.com/blogfiles/jeffa36/WindowsLiveWriter/TechEdAustraliaFreeNetbookonoffer_C2B3/teched200901_3.png" border="0" style="max-height:205px;max-width:240px;" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Hi Community,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Please feel free to&amp;nbsp;&lt;a href="http://www.msteched.com/online/view.aspx?tid=49e91c5d-7fd8-41a7-bf3d-17ce5e32337b"&gt;watch&lt;/a&gt; my Tech Talk interview with &lt;a href="http://blogs.msdn.com/ceibner/default.aspx"&gt;Catherine Eibner&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;hr /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Hola Comunidad,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Por favor si&amp;eacute;ntanse libres de&amp;nbsp;&lt;a href="http://www.msteched.com/online/view.aspx?tid=49e91c5d-7fd8-41a7-bf3d-17ce5e32337b"&gt;ver&lt;/a&gt; mi&amp;nbsp;charla t&amp;eacute;cnica&amp;nbsp;con &lt;a href="http://blogs.msdn.com/ceibner/default.aspx"&gt;Catherine Eibner&lt;/a&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;(Please visit the site to view this media)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1722490" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Slide deck and demo for "Blue Theater" Session and Tech Talk / Láminas y demo utilizados para mi sesión en "Blue Theater" y Tech Talk</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/09/10/slide-deck-and-demo-for-quot-blue-theater-quot-session-and-tech-talk-l-225-minas-y-demo-utilizados-para-mi-sesi-243-n-en-quot-blue-theater-quot-y-tech-talk.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="1082355" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.72.22.11/TechEd09_2D00_I.zip" /><id>/blogs/angelhernandez/archive/2009/09/10/slide-deck-and-demo-for-quot-blue-theater-quot-session-and-tech-talk-l-225-minas-y-demo-utilizados-para-mi-sesi-243-n-en-quot-blue-theater-quot-y-tech-talk.aspx</id><published>2009-09-10T01:52:00Z</published><updated>2009-09-10T01:52:00Z</updated><content type="html">&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;img src="http://blogs.technet.com/blogfiles/jeffa36/WindowsLiveWriter/TechEdAustraliaFreeNetbookonoffer_C2B3/teched200901_3.png" border="0" style="max-height:205px;max-width:240px;" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Hi Community,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Please feel free to download&amp;nbsp;the attached &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.72.22.11/TechEd09_2D00_I.zip"&gt;Slide Deck and demo&lt;/a&gt;&amp;nbsp; used for today&amp;#39;s &amp;quot;Blue Theater&amp;quot; Session and Yesterday&amp;#39;s Tech Talk with &lt;a href="http://blogs.msdn.com/ceibner/default.aspx"&gt;Catherine Eibner&lt;/a&gt; for &lt;a href="http://www.msteched.com/online/home.aspx"&gt;TechEd Online&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;hr /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Hola Comunidad,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Por favor si&amp;eacute;ntanse libres de descargar la &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.72.22.11/TechEd09_2D00_I.zip"&gt;presentaci&amp;oacute;n y demo&lt;/a&gt; utlizados en la sesi&amp;oacute;n&amp;nbsp; en &amp;quot;Blue Theater&amp;quot; de hoy y la charla t&amp;eacute;cnica de ayer con &lt;a href="http://blogs.msdn.com/ceibner/default.aspx"&gt;Catherine Eibner&lt;/a&gt; para &lt;a href="http://www.msteched.com/online/home.aspx"&gt;TechEd Online&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1722211" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Upcoming Speaking Engagements (Próximas ponencias y charlas)</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/07/17/upcoming-speaking-engagements-pr-243-ximas-ponencias-y-charlas.aspx" /><id>/blogs/angelhernandez/archive/2009/07/17/upcoming-speaking-engagements-pr-243-ximas-ponencias-y-charlas.aspx</id><published>2009-07-17T17:55:00Z</published><updated>2009-07-17T17:55:00Z</updated><content type="html">&lt;p&gt;&lt;span style="color:#0000ff;"&gt;These are my upcoming speaking engagements:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;img src="http://blogs.technet.com/blogfiles/jeffa36/WindowsLiveWriter/TechEdAustraliaFreeNetbookonoffer_C2B3/teched200901_3.png" border="0" style="max-height:205px;max-width:240px;" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;SOA342 Windows Azure + SSIS + CRM = It&amp;#39;s a bit cloudy down here&lt;br /&gt;Presenter: Angel Hernandez&lt;br /&gt;&lt;a href="http://www.msteched.com/australia/Public/default.aspx"&gt;http://www.msteched.com/australia/Public/default.aspx&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;.NET Rocks TV&lt;br /&gt;Windows Internals via C#&lt;br /&gt;&lt;a href="http://www.dnrtv.com"&gt;http://www.dnrtv.com&lt;/a&gt; &lt;br /&gt;Sept. 23rd&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Estas son mis pr&amp;oacute;ximas ponencias y/o charlas:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;SOA342 Windows Azure + SSIS + CRM = Est&amp;aacute; un poco nublado ac&amp;aacute; abajo&lt;br /&gt;Ponente: Angel Hernandez&lt;br /&gt;&lt;a href="http://www.msteched.com/australia/Public/default.aspx"&gt;http://www.msteched.com/australia/Public/default.aspx&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;.NET Rocks TV&lt;br /&gt;Windows Internals via C#&lt;br /&gt;&lt;a href="http://www.dnrtv.com"&gt;http://www.dnrtv.com&lt;/a&gt; &lt;br /&gt;Sept. 23&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1702632" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Get the SharePoint version programmatically </title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/07/02/get-the-sharepoint-version-programmatically.aspx" /><id>/blogs/angelhernandez/archive/2009/07/02/get-the-sharepoint-version-programmatically.aspx</id><published>2009-07-02T12:14:00Z</published><updated>2009-07-02T12:14:00Z</updated><content type="html">&lt;p&gt;&lt;span style="color:#0000ff;"&gt;This post is about a question that many developers ask themselves, &amp;iquest;how can I get the SharePoint version programmatically?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;There are at least&amp;nbsp; three possible ways to do this (that I&amp;#39;m aware of):&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Accesing the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spfarm.buildversion.aspx"&gt;SPFarm.BuildVersion&lt;/a&gt; property&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Impersonate through&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx"&gt;SPSecurity.RunWithElevatedPrivileges&lt;/a&gt;&amp;nbsp;&amp;nbsp;and&amp;nbsp; retrieve this information from the registry &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Implement&amp;nbsp;WMI&amp;nbsp;and execute the following&amp;nbsp;WQL: &lt;strong&gt;&lt;em&gt;Select * From Win32_SoftwareFeature Where ProductName Like &amp;quot;%SharePoint Server%&amp;quot;&lt;/em&gt;&lt;/strong&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;in combination with the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.management.managementobjectsearcher.aspx"&gt;ManagementObjectSearcher&lt;/a&gt; class&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;In my case, I&amp;#39;m always using&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/aa394554(VS.85).aspx"&gt;WMI&lt;/a&gt;&amp;nbsp;and Windows provides us with the right tool (&lt;strong&gt;&lt;em&gt;WBEMTEST.EXE)&lt;/em&gt;&lt;/strong&gt;&amp;nbsp;to try our&amp;nbsp; WQL queries&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1697573" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Determinando el número de versión de SharePoint programáticamente</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/07/02/determinando-el-n-250-mero-de-versi-243-n-de-sharepoint-program-225-ticamente.aspx" /><id>/blogs/angelhernandez/archive/2009/07/02/determinando-el-n-250-mero-de-versi-243-n-de-sharepoint-program-225-ticamente.aspx</id><published>2009-07-02T10:50:00Z</published><updated>2009-07-02T10:50:00Z</updated><content type="html">&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Este post trata de una pregunta que muchos desarrolladores&amp;nbsp;se hacen, &amp;iquest;c&amp;oacute;mo determino la versi&amp;oacute;n de SharePoint que tengo instalada por medio de c&amp;oacute;digo?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;A continuaci&amp;oacute;n enumero las tres posibles maneras (que yo conozco para hacerlo):&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Haciendo uso de la propiedad &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spfarm.buildversion.aspx"&gt;SPFarm.BuildVersion&lt;/a&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Impersonar por medio de &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx"&gt;SPSecurity.RunWithElevatedPrivileges&lt;/a&gt;&amp;nbsp;&amp;nbsp;y recuperar estos valores del registro de Windows&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Hacer uso de WMI y del siguiente WQL: &lt;strong&gt;&lt;em&gt;Select * From Win32_SoftwareFeature Where ProductName Like &amp;quot;%SharePoint Server%&amp;quot;&lt;/em&gt;&lt;/strong&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;en combinaci&amp;oacute;n con la clase &lt;a href="http://msdn.microsoft.com/en-us/library/system.management.managementobjectsearcher.aspx"&gt;ManagementObjectSearcher&lt;/a&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;En mi caso particular, siempre hago uso de &lt;a href="http://msdn.microsoft.com/en-us/library/aa394554(VS.85).aspx"&gt;WMI&lt;/a&gt; y Windows nos ofrece &lt;strong&gt;&lt;em&gt;WBEMTEST.EXE&lt;/em&gt;&lt;/strong&gt; para probar nuestras consultas WQL&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1697570" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Memory Mapped Files</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/06/25/memory-mapped-files.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="210058" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.69.67.59/MemDemo.zip" /><id>/blogs/angelhernandez/archive/2009/06/25/memory-mapped-files.aspx</id><published>2009-06-26T02:28:00Z</published><updated>2009-06-26T02:28:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Writing code nowadays can be considered as a &amp;quot;cheerful experience&amp;quot;,&amp;nbsp;we have a complete set of tools and development environments that make us more productive, helping us in the delivery of&amp;nbsp;high-quality software. 15 years ago it was a hard task to find IDEs with Intellisense support, we used to store our application settings in .INI files and we didn&amp;#39;t even have any virtualization environment in order to perform tests before sending out our solution to the customers, that&amp;#39;s why it&amp;#39;s a new adventure each time we got engaged on a new development project and coding hasn&amp;#39;t ever been as&amp;nbsp;enjoyable as it is today. A few years ago I read a book written by Jeffrey Richter called &amp;quot;Advanced Windows&amp;quot; and I learned heaps from this book, as a matter of fact, last year I bought his latest book called &amp;quot;Windows via C/C++&amp;quot; which is a classic and a must have in every Windows developer toolbox, same thing occurs with Charles Petzold&amp;#39;s book, however I learned a lot about Windows internal mechanisms by reading Richter&amp;#39;s, for instance, how can processes exchange information between them? What&amp;#39;s the difference between a Mutex and a Semaphore for threads synchronization? just to mention a few. Windows is a product that has evolved and grown throughout the years, despite of new APIs&amp;nbsp;and functionality that have been included into it we will always need access to the PC&amp;#39;s memory, for example we can mention Inter-Process Communication (IPC) and virtual memory access, this post is about it pretty much, how can I get access to the virtual memory so I can address and use a given amount of bytes? I think you know already what I&amp;#39;m talking about. Memory Mapped Files can be defined as &amp;quot;a segment of virtual memory which has been assigned a direct byte-for-byte correlation with some portion of a file or file-like resource. This resource is typically a file that is physically present on-disk, but can also be a device, shared memory object or other resource that the operating system can reference through a file descriptor&amp;quot;. They have three main purposes which are:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Load and execute .exe files and DLLs &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Access files on-disk very quickly without using buffers. Windows handles this for us&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Allow many processes to share information in memory &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;The following diagram depicts some implementations for memory mapped files&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6371.clip_5F00_image002_5F00_27CB60FB.gif"&gt;&lt;img height="164" width="461" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6874.clip_5F00_image002_5F00_thumb_5F00_05935575.gif" alt="clip_image002" border="0" title="clip_image002" style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Once the file is mapped in memory, a view&amp;nbsp;based on&amp;nbsp;that file needs to be created, I mean, a region or space within the file which allows a process to read and write onto it, when creating the&amp;nbsp;view we specify&amp;nbsp;bytes to be mapped, file offset and desired access, this process is shown in the image below&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&amp;nbsp;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6303.image_5F00_23916369.png"&gt;&lt;img height="298" width="366" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/3644.image_5F00_thumb_5F00_5A8B41A2.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;One of the new features bundled in .NET Framework 4.0 besides DLR (Dynamic Language Runtime), parallel processing and support for memory mapped files. The code that accompanies this post demonstrates how to do it using the new MemoryMappedFile class plus my own&amp;nbsp;implementation with .NET 3.5, C# and&amp;nbsp;a little of Interop. &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Further reading about this topic can be found at&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Virtual_memory"&gt;Virtual Memory&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Paging"&gt;Paging&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;p align="center" id="video_1696759"&gt;&lt;a href="http://ajhsis.com/Community/MappedFile_English.swf"&gt;&lt;img src="http://9ras1w.bay.livefilestore.com/y1p7mmg7IDxhkDiCiNHaYzMzVdmRF9QBuHnyNUgZCvbSE8n5zmD9AjCd5GIBq-lvic_DUbkLB6MD8B-fiPBqB1-rAS55-RQoDEH/thumb1.jpg" border = "0" width="550" height="350"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href = "http://ajhsis.com/Community/MappedFile_English.swf"&gt;View Video&lt;/a&gt;&lt;br /&gt;Format: swf&lt;br /&gt;Duration: 22 min&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1696759" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Archivos Mapeados en Memoria</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/06/24/archivos-mapeados-en-memoria.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="210058" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.69.65.25/MemDemo.zip" /><id>/blogs/angelhernandez/archive/2009/06/24/archivos-mapeados-en-memoria.aspx</id><published>2009-06-24T06:37:00Z</published><updated>2009-06-24T06:37:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hoy en d&amp;iacute;a es ameno &amp;ldquo;echar c&amp;oacute;digo&amp;rdquo;, pues tenemos herramientas de desarrollo que nos ayudan a ser productivos y aseguramos la calidad del software que hacemos. Hace 15 a&amp;ntilde;os atr&amp;aacute;s era dif&amp;iacute;cil encontrar entornos de desarrollo con Intellisense, guard&amp;aacute;bamos nuestra configuraci&amp;oacute;n en archivos .INI y no dispon&amp;iacute;amos de virtualizaci&amp;oacute;n para probar nuestra aplicaci&amp;oacute;n antes de enviarla al cliente, por eso en la actualidad cada d&amp;iacute;a es una aventura y programar es m&amp;aacute;s divertido. Hace unos a&amp;ntilde;os atr&amp;aacute;s le&amp;iacute; un libro escrito por Jeffrey Richter titulado &amp;ldquo;Programaci&amp;oacute;n avanzada para Windows 95/NT&amp;rdquo;, aprend&amp;iacute; mucho de ese libro&amp;nbsp; de hecho el a&amp;ntilde;o pasado me compr&amp;eacute; la &amp;uacute;ltima edici&amp;oacute;n del mismo titulado &amp;ldquo;Windows via C/C++&amp;rdquo;, es un cl&amp;aacute;sico como el libro de Charles Petzold, sin embargo con el libro de Richter aprend&amp;iacute; cosas sobre el funcionamiento interno del Sistema Operativo, por ejemplo, &amp;iquest;c&amp;oacute;mo los procesos pueden intercambiar informaci&amp;oacute;n entre s&amp;iacute;?, &amp;iquest;cu&amp;aacute;l es la diferencia entre un Mutex y un sem&amp;aacute;foro para sincronizar hilos? y muchas otras cosas m&amp;aacute;s. Windows es un producto que ha madurado y crecido con el paso de los a&amp;ntilde;os, a pesar de nuevas APIs y funcionalidad siempre tendremos que tener acceso a la memoria del PC, un ejemplo de esto es la comunicaci&amp;oacute;n entre procesos (IPC) y el acceso a la memoria virtual, el siguiente post trata de eso, &amp;iquest;c&amp;oacute;mo utilizar la memoria virtual para as&amp;iacute; direccionar y/o utilizar una cantidad de memoria que yo desee? Me imagino, ya saben a lo que me refiero y es Archivos mapeados en memoria (Memory Mapped Files) que lo podr&amp;iacute;amos definir como &amp;ldquo;un segmento de la memoria virtual la cual se le ha asignado una correlaci&amp;oacute;n directa byte a byte con alguna porci&amp;oacute;n de un archivo &amp;oacute; alg&amp;uacute;n otro recurso, el cu&amp;aacute;l t&amp;iacute;picamente es un archivo en disco pero tambi&amp;eacute;n puede ser un dispositivo, un objeto compartido de memoria u otro recurso que el sistema operativo pueda referenciar a trav&amp;eacute;s de un descriptor de archivo&amp;rdquo;. Los archivos mapeados en memoria tienen tres prop&amp;oacute;sitos los cuales son:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Cargar y ejecutar archivos .exe y bibliotecas de enlace din&amp;aacute;mico (DLL)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Accesar archivos en disco r&amp;aacute;pidamente sin necesidad de usar b&amp;uacute;feres, Windows se encarga de esto por nosotros&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Permitir a varios procesos compartir la misma informaci&amp;oacute;n en memoria&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;El siguiente diagrama muestra alguna de las implementaciones para los archivos mapeados en memoria&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6371.clip_5F00_image002_5F00_27CB60FB.gif"&gt;&lt;img height="164" width="461" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6874.clip_5F00_image002_5F00_thumb_5F00_05935575.gif" alt="clip_image002" border="0" title="clip_image002" style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Una vez que el archivo se encuentra mapeado en memoria, es necesario crear una vista basada en el mismo, es decir, una regi&amp;oacute;n &amp;oacute; espacio dentro del archivo a la cu&amp;aacute;l un proceso puede leer y escribir, al momento de crear la vista se especifica desde donde se va a comenzar a manipular el archivo as&amp;iacute; como el n&amp;uacute;mero de bytes a utilizar, este proceso lo podemos ver en la imagen mostrada a continuaci&amp;oacute;n&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6303.image_5F00_23916369.png"&gt;&lt;img height="298" width="366" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/3644.image_5F00_thumb_5F00_5A8B41A2.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Una de las caracter&amp;iacute;sticas nuevas que trae consigo el .NET Framework 4.0 adem&amp;aacute;s de DLR (Dynamic Language Runtime), procesamiento paralelo y muchas otras m&amp;aacute;s, es el soporte para archivos mapeados en memoria, el c&amp;oacute;digo de este posting demuestra como hacerlo con la nueva clase MemoryMappedFile as&amp;iacute; como mi propia implementaci&amp;oacute;n con .NET 3.5, C# y un poco de Interop.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Si deseas leer un poco m&amp;aacute;s sobre este tema puedes revisar estos links en Wikipedia: &lt;/span&gt;&lt;a href="http://es.wikipedia.org/wiki/Memoria_virtual"&gt;&lt;span style="color:#0000ff;"&gt;Memoria Virtual&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;y &lt;/span&gt;&lt;a href="http://es.wikipedia.org/wiki/Paginaci%C3%B3n"&gt;&lt;span style="color:#0000ff;"&gt;Paginaci&amp;oacute;n de Memoria&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;p align="center" id="video_1696525"&gt;&lt;a href="http://ajhsis.com/Community/MappedFile_Spanish.swf"&gt;&lt;img src="http://9ras1w.bay.livefilestore.com/y1p7mmg7IDxhkDiCiNHaYzMzVdmRF9QBuHnyNUgZCvbSE8n5zmD9AjCd5GIBq-lvic_DUbkLB6MD8B-fiPBqB1-rAS55-RQoDEH/thumb1.jpg" border = "0" width="550" height="350"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href = "http://ajhsis.com/Community/MappedFile_Spanish.swf"&gt;View Video&lt;/a&gt;&lt;br /&gt;Format: swf&lt;br /&gt;Duration: 38 Min&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1696525" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Extending the Exception class, getting Win32 error messages plus extension methods</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/06/08/extending-exception-class-getting-win32-error-messages-plus-extension-methods.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="1173596" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.69.45.37/FormatError.zip" /><id>/blogs/angelhernandez/archive/2009/06/08/extending-exception-class-getting-win32-error-messages-plus-extension-methods.aspx</id><published>2009-06-08T10:53:00Z</published><updated>2009-06-08T10:53:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Structured Exception Handling (SEH), it&amp;rsquo;s one of the top used features by developers, it&amp;rsquo;s not required any more to be dealing with On Error labels or any other less elegant mechanism to handle error conditions, however .NET Framework is an existing layer between our application and the operating system, even when the Exception class describes an error condition it doesn&amp;rsquo;t provide the error code and message associated to the operating system, that&amp;rsquo;s why it&amp;rsquo;s frustrating sometimes to interpret some &amp;ldquo;less-descriptive&amp;rdquo; exceptions and hence recovering any Windows error information can be of great help. Throughout the years Windows API has evolved and grown in size and error messages as well, many of these messages can be found in the SDK and WDK, so I had this idea about extending the Exception class by implementing an extension method. Extension methods enable us to &amp;ldquo;add&amp;rdquo; methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type. They are a special kind of static method, but they are called as if they were instance methods on the extended type. The most common extension methods are&amp;nbsp; the LINQ standard query operators that add query functionality to the existing IEnumerable and IEnumerable&amp;lt;T&amp;gt;.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;To retrieve the description for a given error code we use the FormatMessage function, as it&amp;rsquo;s shown below&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;[DllImport(&lt;span class="str"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;, CharSet = CharSet.Auto, SetLastError = &lt;span class="kwrd"&gt;true&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;           CallingConvention = CallingConvention.Winapi)]&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FormatMessage(&lt;span class="kwrd"&gt;int&lt;/span&gt; dwFlags, &lt;span class="kwrd"&gt;int&lt;/span&gt; lpSource, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwMessageId,&lt;/pre&gt;
&lt;pre&gt;                     &lt;span class="kwrd"&gt;int&lt;/span&gt; dwLanguageId, &lt;span class="kwrd"&gt;out&lt;/span&gt; StringBuilder lpBuffer,&lt;/pre&gt;
&lt;pre class="alt"&gt;                       &lt;span class="kwrd"&gt;int&lt;/span&gt; nSize, IntPtr va_list);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;The extension method used is the following &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ExceptionExtension {&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// Gets the win32 error description.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;ex&amp;quot;&amp;gt;The ex.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Win32Error GetWin32ErrorDescription(&lt;span class="kwrd"&gt;this&lt;/span&gt; Exception ex) {&lt;/pre&gt;
&lt;pre&gt;        Win32Error retval = Win32Error.Empty;&lt;/pre&gt;
&lt;pre class="alt"&gt;        StringBuilder pMsgBuf = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; lastError = FormatErrorHelper.GetLastError();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        FormatErrorHelper.FormatMessage(&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.FORMAT_MESSAGE_ALLOCATE_BUFFER |&lt;/pre&gt;
&lt;pre class="alt"&gt;               FormatErrorHelper.FORMAT_MESSAGE_FROM_SYSTEM,&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.NULL,   lastError, &lt;/pre&gt;
&lt;pre class="alt"&gt;               FormatErrorHelper.MakeLangID(FormatErrorHelper.LANG_NEUTRAL,&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.SUBLANG_DEFAULT), &lt;span class="kwrd"&gt;out&lt;/span&gt; pMsgBuf, 0, IntPtr.Zero);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;         retval.ErrorCode = lastError;&lt;/pre&gt;
&lt;pre class="alt"&gt;         retval.Description = pMsgBuf != &lt;span class="kwrd"&gt;null&lt;/span&gt; ? pMsgBuf.ToString() : &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;         &lt;span class="kwrd"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;
&lt;pre&gt;      }&lt;/pre&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;So if we catch any exception, besides obtaining the exception object itself we get the error and message code from the operating system&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;Win32Error osError = Win32Error.Empty;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;try&lt;/span&gt; {&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="rem"&gt;// Some funky exception here...&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;} &lt;span class="kwrd"&gt;catch&lt;/span&gt;(Exception ex) {&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;  osError = ex.GetWin32ErrorDescription();&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;  Console.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;Code: {0} - Description: {1}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] {osError.ErrorCode, osError.Description}));  &lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;If we implement everything we&amp;rsquo;ve previously mentioned, see the difference between the exception message and the message provided by the operating system &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a&gt;&lt;img height="307" width="678" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/5810.image_5F00_thumb2_5F00_6E1B5EFB.png" alt="image_thumb[2]" border="0" title="image_thumb[2]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Hope this helps,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1694537" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry><entry><title>Extendiendo la clase Exception, recuperando mensajes de error de Win32 además de los métodos de extensión</title><link rel="alternate" type="text/html" href="/blogs/angelhernandez/archive/2009/06/08/extendiendo-la-clase-exception-recuperando-mensajes-de-error-de-win32-adem-225-s-de-los-m-233-todos-de-extensi-243-n.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="1173596" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.69.45.34/FormatError.zip" /><id>/blogs/angelhernandez/archive/2009/06/08/extendiendo-la-clase-exception-recuperando-mensajes-de-error-de-win32-adem-225-s-de-los-m-233-todos-de-extensi-243-n.aspx</id><published>2009-06-08T10:19:00Z</published><updated>2009-06-08T10:19:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;El manejo estructurado de excepciones, es una de las caracter&amp;iacute;sticas que como desarrolladores utilizamos m&amp;aacute;s a menudo, ya no es necesario estar implementando etiquetas On Error u otro mecanismo poco elegante para manejar condiciones de error, sin embargo el .NET Framework es una capa entre el sistema operativo y nuestra aplicaci&amp;oacute;n, aunque la clase Exception describe una condici&amp;oacute;n de error, carece del c&amp;oacute;digo de error y descripci&amp;oacute;n asociado al sistema operativo, en muchas ocasiones el interpretar algunas excepciones puede llegar en cierto punto ser algo frustrante porque no es muy descriptivo, por lo que no ser&amp;iacute;a mala idea recuperar la informaci&amp;oacute;n de error emitida por Windows. Con el paso de los a&amp;ntilde;os, el API de Windows ha crecido y as&amp;iacute; mismo la cantidad de mensajes de error subyacentes, en el SDK de la plataforma se consigue informaci&amp;oacute;n sobre estos mensajes de error y lo mismo sucede con el WDK, por lo que se me ocurri&amp;oacute; la idea de extender la clase Exception a trav&amp;eacute;s de un m&amp;eacute;todo de extensi&amp;oacute;n. Los m&amp;eacute;todos de extensi&amp;oacute;n, nos permiten &amp;ldquo;agregar &amp;ldquo;m&amp;eacute;todos a tipos de datos existentes sin la necesidad de crear un tipo derivado, recompilar &amp;oacute; modificar el tipo original. Estos m&amp;eacute;todos son un tipo especial de m&amp;eacute;todo est&amp;aacute;tico que son llamados como si fueran m&amp;eacute;todos de instancia en el tipo extendido. Su uso m&amp;aacute;s com&amp;uacute;n es con LINQ para as&amp;iacute; conseguir funcionalidad adicional de los tipos IEnumerable e IEnumerable&amp;lt;T&amp;gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Para recuperar la descripci&amp;oacute;n de un c&amp;oacute;digo de error utilizamos la funci&amp;oacute;n FormatMessage, como mostramos a continuaci&amp;oacute;n&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;[DllImport(&lt;span class="str"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;, CharSet = CharSet.Auto, SetLastError = &lt;span class="kwrd"&gt;true&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;           CallingConvention = CallingConvention.Winapi)]&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FormatMessage(&lt;span class="kwrd"&gt;int&lt;/span&gt; dwFlags, &lt;span class="kwrd"&gt;int&lt;/span&gt; lpSource, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwMessageId,&lt;/pre&gt;
&lt;pre&gt;                     &lt;span class="kwrd"&gt;int&lt;/span&gt; dwLanguageId, &lt;span class="kwrd"&gt;out&lt;/span&gt; StringBuilder lpBuffer,&lt;/pre&gt;
&lt;pre class="alt"&gt;                       &lt;span class="kwrd"&gt;int&lt;/span&gt; nSize, IntPtr va_list);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;El m&amp;eacute;todo de extensi&amp;oacute;n utilizado con la clase Exception es el siguiente&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ExceptionExtension {&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// Gets the win32 error description.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;ex&amp;quot;&amp;gt;The ex.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Win32Error GetWin32ErrorDescription(&lt;span class="kwrd"&gt;this&lt;/span&gt; Exception ex) {&lt;/pre&gt;
&lt;pre&gt;        Win32Error retval = Win32Error.Empty;&lt;/pre&gt;
&lt;pre class="alt"&gt;        StringBuilder pMsgBuf = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; lastError = FormatErrorHelper.GetLastError();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        FormatErrorHelper.FormatMessage(&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.FORMAT_MESSAGE_ALLOCATE_BUFFER |&lt;/pre&gt;
&lt;pre class="alt"&gt;               FormatErrorHelper.FORMAT_MESSAGE_FROM_SYSTEM,&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.NULL,   lastError, &lt;/pre&gt;
&lt;pre class="alt"&gt;               FormatErrorHelper.MakeLangID(FormatErrorHelper.LANG_NEUTRAL,&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.SUBLANG_DEFAULT), &lt;span class="kwrd"&gt;out&lt;/span&gt; pMsgBuf, 0, IntPtr.Zero);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;         retval.ErrorCode = lastError;&lt;/pre&gt;
&lt;pre class="alt"&gt;         retval.Description = pMsgBuf != &lt;span class="kwrd"&gt;null&lt;/span&gt; ? pMsgBuf.ToString() : &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;         &lt;span class="kwrd"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;
&lt;pre&gt;      }&lt;/pre&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Por lo que al atrapar alguna excepci&amp;oacute;n, adem&amp;aacute;s de obtener el objeto Exception como tal tambi&amp;eacute;n obtengo el c&amp;oacute;digo y mensaje de error del sistema operativo&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;Win32Error osError = Win32Error.Empty;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;try&lt;/span&gt; {&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="rem"&gt;// Some funky exception here...&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;} &lt;span class="kwrd"&gt;catch&lt;/span&gt;(Exception ex) {&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;  osError = ex.GetWin32ErrorDescription();&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;  Console.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;Code: {0} - Description: {1}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] {osError.ErrorCode, osError.Description}));  &lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Si ponemos en pr&amp;aacute;ctica todo lo mencionado anteriormente, vean lo diferente que es el mensaje de proporcionado por el .NET Framework al del sistema operativo&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/5810.image_5F00_7B0652C7.png"&gt;&lt;img height="304" width="678" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/7360.image_5F00_thumb_5F00_4BF3F123.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Espero sea de utilidad,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1694534" width="1" height="1"&gt;</content><author><name>AngelHernandez</name><uri>http://msmvps.com/members/AngelHernandez/default.aspx</uri></author></entry></feed>