<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>VB Migration Partner</title>
    <description>blog</description>
    <link>http://www.vbmigration.com/Blog/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.Net Syndication Generator 1.0.0.0 (http://dotnetblogengine.net/)</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://www.vbmigration.com/Blog/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.vbmigration.com/blog/syndication.axd</blogChannel:blink>
    <dc:creator>My name</dc:creator>
    <dc:description>blog</dc:description>
    <dc:title>VB Migration Partner</dc:title>
    <geo:lat>100.000000</geo:lat>
    <geo:long>100.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/VbMigrationPartner" type="application/rss+xml" /><item>
      <title>SIS is new Code Architects' partner !</title>
      <description>&lt;p&gt;
&lt;a href="http://www.sisworld.com/dbf/main.sis" target="_blank"&gt;&lt;img src="http://www.vbmigration.com/Blog/image.axd?picture=SIS_Logo.gif" alt="" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.sisworld.com/dbf/main.sis" target="_blank"&gt;SIS &lt;/a&gt;is a Microsoft Certified Partner who has used VB Migration Partner to successfully migrate VB6 apps, including a large legacy application counting. (You can read the entire story &lt;a href="http://www.vbmigration.com/Blog/casestudies/sis.aspx" target="_blank"&gt;here&lt;/a&gt;.)
&lt;/p&gt;
&lt;p&gt;
In these months they have gained an impressive knowledge of both our software and of migration issues in general, and we are now proud to announce that &lt;strong&gt;SIS &lt;/strong&gt;and &lt;strong&gt;Code Architects &lt;/strong&gt;have signed a partnership agreement, according to which SIS will offer both VB Migration Partner and custom migration services. 
&lt;/p&gt;
&lt;p&gt;
That&amp;#39;s good news for companies based in Austria and Germany and wishing to convert their VB6 code to VB.NET! 
&lt;/p&gt;
&lt;p&gt;
More links&amp;nbsp; (in German):
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;SIS &lt;a href="http://www.sisworld.com/dbf/main.sis" target="_blank"&gt;home page&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;The &lt;a href="http://www.sisworld.com/dbf/doc_detail.sis?StID=244521&amp;amp;topic=Automatische%20Konvertierung%20von%20VB6-Systemen%20nach%20.NET" target="_blank"&gt;agreement &lt;/a&gt;between SIS and Code Architects&lt;/li&gt;
	&lt;li&gt;SIS &lt;a href="http://www.sisworld.com/dbf/doc_detail.sis?StID=244464&amp;amp;topic=Nutzt%20auch%20Ihre%20Organisation%20noch%20immer%20VB6-Anwendungen?" target="_blank"&gt;migration services&lt;/a&gt; &lt;br /&gt;
	&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=0Lpi5xPRK18:o9g0SDQDnoQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=0Lpi5xPRK18:o9g0SDQDnoQ:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/06/SIS-is-new-Code-Architects'-partner-!.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/06/SIS-is-new-Code-Architects'-partner-!.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=3fac586e-1400-41b0-b9b2-afd9c9f2b4d6</guid>
      <pubDate>Fri, 26 Jun 2009 02:20:00 -0700</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=3fac586e-1400-41b0-b9b2-afd9c9f2b4d6</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=3fac586e-1400-41b0-b9b2-afd9c9f2b4d6</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/06/SIS-is-new-Code-Architects'-partner-!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=3fac586e-1400-41b0-b9b2-afd9c9f2b4d6</wfw:commentRss>
    </item>
    <item>
      <title>Support for "classic" (VB3-style) drag-and-drop !</title>
      <description>&lt;p&gt;
Since its early beta versions VB Migration Partner has always supported the conversion of OLE drag-and-drop features, including the OLEDragMode and OLEDropMode properties, the OLEDrag method, and all OLExxx events. All these members are fully supported and developers don&amp;#39;t need to manually edit either the VB6 code and the migrated VB.NET code. 
&lt;/p&gt;
&lt;p&gt;
In the past year our customers have shown to greatly appreciate this feature, thus we are very proud to announce that &lt;font color="#000000"&gt;&lt;strong&gt;we have extended the support to &amp;quot;classic&amp;quot; drag-and-drop&lt;/strong&gt;&lt;/font&gt;, i.e. the DragDrop and DragIcon properties, the Drag method, and the DragOver and DragDrop events. As for OLE D&amp;amp;D, all the features are fully supported and no manual edits are required, neither before nor after the migration. 
&lt;/p&gt;
&lt;p&gt;
It almost goes without saying that &lt;font color="#3366ff"&gt;&lt;strong&gt;VB Migration Partner is the only VB6-to-VB.NET conversion tool that fully supports &amp;quot;classic&amp;quot; drag-and-drop. &lt;/strong&gt;&lt;/font&gt;The new features will be included in forthcoming version 1.10.01, due in one-two weeks.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In addition to demonstrating that Code Architects is relentlessly improving VB Migration Partner, this announcement also proves many of the advantages of a rich support library (as opposed to other conversion tools).
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;No need to re-migrate a VB.NET application that has been already migrated. Registered users of previous versions only need to download the new
	support library and - presto! - their converted VB.NET apps will
	automatic leverage D&amp;amp;D support!&lt;/li&gt;
	&lt;li&gt;No need to learn how drag-and-drop works in VB.NET and no need to revise how it worked in VB6, which in turn means fewer training costs and fewer issues if the original VB developers have left the company in the meantime.&lt;/li&gt;
	&lt;li&gt;No need to purchase a new license for VB Migration Partner: as our customers know, users of version 1.xx have &lt;strong&gt;the lifetime right to download any future 1.xx versions of the support library&lt;/strong&gt;, free of charge!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If you want to learn more about the many advantages of our support library, read &lt;a href="http://www.vbmigration.com/Blog/whitepapers/support_library.aspx" target="_blank"&gt;17 Reasons for Using a Support Library in Migration Scenarios&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
If you want to learn more about the differences between VB Migration Partner and other conversion tools, read &lt;a href="http://www.vbmigration.com/Blog/whitepapers/featurecomparison.aspx" target="_blank"&gt;Migration Tools: Feature Comparison Table&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=jIsrOEK4jwg:iNVJG3YHY6I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=jIsrOEK4jwg:iNVJG3YHY6I:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/06/Support-for-classic-(VB3-style)-drag-and-drop-!.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/06/Support-for-classic-(VB3-style)-drag-and-drop-!.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=a767dc63-7a1c-4221-8854-87a6d71ebd28</guid>
      <pubDate>Wed, 17 Jun 2009 19:39:00 -0700</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=a767dc63-7a1c-4221-8854-87a6d71ebd28</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=a767dc63-7a1c-4221-8854-87a6d71ebd28</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/06/Support-for-classic-(VB3-style)-drag-and-drop-!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=a767dc63-7a1c-4221-8854-87a6d71ebd28</wfw:commentRss>
    </item>
    <item>
      <title>Code Architects joins the Visual Studio Industry Partner program</title>
      <description>&lt;p&gt;
&lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/99ad3788-deea-4c8e-b5cc-4b0ce0f4e3de"&gt;&lt;img src="/images/vsip-home.png" alt="" width="100" height="62" /&gt; &lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Three days ago, on May 22, it was both VB Migration Partner&amp;#39;s birthday and the day when we released our 1.11 version, a new milestone in VB6-to-VB.NET conversion technology. 
&lt;/p&gt;
&lt;p&gt;
Later in the same day, we were also &amp;quot;officially&amp;quot; accepted by Microsoft Corp. as part of the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/99ad3788-deea-4c8e-b5cc-4b0ce0f4e3de" target="_blank"&gt;Visual Studio Industry Partner program&lt;/a&gt;. It&amp;#39;s an important acknowledgement of Code Architects&amp;#39;s role in helping developers and software companies move their legacy VB6 apps to .NET. 
&lt;/p&gt;
&lt;p&gt;
You can read the entire story in this &lt;a href="http://www.vbmigration.com/Blog/press/PressReleaseVSIP.aspx" target="_blank"&gt;press release&lt;/a&gt;. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=axPKgxK-Wk4:uOmwCW0KtxI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=axPKgxK-Wk4:uOmwCW0KtxI:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/05/Code-Architects-joins-the-Visual-Studio-Industry-Partner-program.aspx</link>
      <author>Admin</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/05/Code-Architects-joins-the-Visual-Studio-Industry-Partner-program.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=fb2c4cb4-e783-4b11-94cd-fda0bfc71dcb</guid>
      <pubDate>Mon, 25 May 2009 01:55:00 -0700</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=fb2c4cb4-e783-4b11-94cd-fda0bfc71dcb</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=fb2c4cb4-e783-4b11-94cd-fda0bfc71dcb</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/05/Code-Architects-joins-the-Visual-Studio-Industry-Partner-program.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=fb2c4cb4-e783-4b11-94cd-fda0bfc71dcb</wfw:commentRss>
    </item>
    <item>
      <title>Happy birthday VB Migration Partner... and welcome version 1.11 !</title>
      <description>&lt;p&gt;
Exactly &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2008/05/Alive-and-kicking-VB-Migration-Partner-10-has-been-released!.aspx" target="_blank"&gt;365 days ago&lt;/a&gt; we released VB Migration Partner 1.00, after a 8-month public beta period and &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2007/11/The-story-behind-VB-Migration-Partner.aspx" target="_blank"&gt;2.5 years of intense development&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
A lot of things have happened in these 12 months. In spite of us being relatively unknown outside Italy, our software gained immediate popularity among VB6 developers, who had been waiting for a product like VB Migration Partner since the .NET launch in 2002, that is when they realized that the Upgrade Wizard included in Visual Studio is a little more than a toy and that other VB6-.NET conversion tools leave much to be desired. 
&lt;/p&gt;
&lt;p&gt;
Understandably, the only people who weren&amp;#39;t very happy of our debut were our competitors, whose products had something to be compared with, at last. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;VB Migration Partner 1.00 &lt;/strong&gt;included several unique features that couldn&amp;#39;t be found in any other similar tool, including those that had been on the market for 6 years, such as support for Gosub and On Goto/Gosub statements, As Any clauses and callbacks&amp;nbsp;in Declare, graphic statements, and drag-and-drop. One year later our competitors are still trying to catch up and are now slowly adding some of the features that we support since our earlier beta versions. 
&lt;/p&gt;
&lt;p&gt;
18 months after we launched the vbmigration website and unveiled our software, &lt;a href="http://www.vbmigration.com/Blog/whitepapers/featurecomparison.aspx" target="_blank"&gt;VB Migration Partner is still the only conversion tool that supports granularly scoped &lt;strong&gt;migration pragmas &lt;/strong&gt;and the &lt;/a&gt;&lt;strong&gt;&lt;a href="http://www.vbmigration.com/Blog/whitepapers/featurecomparison.aspx" target="_blank"&gt;convert-test-fix methodology&lt;/a&gt;, &lt;/strong&gt;both of which are essential in complex, real-world&amp;nbsp;migration projects. 
&lt;/p&gt;
&lt;p&gt;
However, we didn&amp;#39;t rest for long, and in September &amp;#39;08 we launched &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2008/09/Announcing-VB-Migration-Partner-110---the-refactoring-release!.aspx" target="_blank"&gt;VB Migration Partner 1.10&lt;/a&gt;&lt;strong&gt;,&lt;/strong&gt; also known as the &lt;a target="_blank"&gt;&lt;strong&gt;Refactoring Release&lt;/strong&gt;&lt;/a&gt;. Even if apparently we just changed the minor version number, we actually re-wrote the parser and conversion engine from scratch. It was a painful but necessary step, because we needed to support important features, such as refactoring of Gosub into separate methods, type inference, conversion of On Error into Try-Catch blocks, and a rename engine to ensure compliance with .NET coding guidelines. 
&lt;/p&gt;
&lt;p&gt;
A few days before the official release date an important customer asked for &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2008/11/Exploring-version-110---Staged-migrations-and-binary-compatibility.aspx" target="_blank"&gt;binary compatibility&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;of .NET DLLs with the original VB6 component, and we managed to add that, too! Binary compatibility you can migrate an N-tier application in pieces, starting with the innermost data tier, so that you can use the business and user-interface tier to test the new components. It might look as a minor detail, yet &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2008/11/Exploring-version-110---Staged-migrations-and-binary-compatibility.aspx" target="_blank"&gt;it dramatically cuts test and debug time/cost&lt;/a&gt; and allows you to focus on the portions of the application where the introduction of .NET and the replacement of old, non-scalable COM components has the higher benefits. 
&lt;/p&gt;
&lt;p&gt;
Well, I couldn&amp;#39;t find a better way to celebrate the VB Migration Partner&amp;#39;s birthday than by announcing that &lt;strong&gt;&lt;font color="#ff0000"&gt;we just released version 1.11&lt;/font&gt; &lt;/strong&gt;a few hours ago! 
&lt;/p&gt;
&lt;p&gt;
If version 1.10 was the Refactoring release, the new version 1.11 can be dubbed as the &lt;strong&gt;&lt;font color="#0000ff"&gt;Variant release&lt;/font&gt;&lt;/strong&gt;. We rewrote the portion of the conversion engine that deals with Variant variables and extended the special VB6Variant type in our library so that it now behaves in exactly the same way as the VB6 Variant data type, including full support for &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2009/05/Can-your-VB6-conversion-tool-handle-null-propagation.aspx" target="_blank"&gt;Null propagation&lt;/a&gt;, Empty and missing values, and arrays of arrays. All the methods in the support library can now take a VB6Variant and return a VB6Variant as necessary. 
&lt;/p&gt;
&lt;p&gt;
Support for null propagation simplifies the conversion of database-intensive projects to VB.NET more than any other feature, but we didn&amp;#39;t stop there. The &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2009/05/Announcing-release-111.aspx" target="_blank"&gt;new version 1.11&lt;/a&gt; also generates better code for late-bound properties and methods, for B-string functions (e.g. LeftB and InputB), and for non-Latin alphabets. As usual, you can read all the details in the Version History.txt file, in the setup folder. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=vL-WRwVGDwk:I6HvLBZEgkU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=vL-WRwVGDwk:I6HvLBZEgkU:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/05/Happy-birthday-VB-Migration-Partner-and-welcome-version-111-!.aspx</link>
      <author>Admin</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/05/Happy-birthday-VB-Migration-Partner-and-welcome-version-111-!.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=31e8156d-2805-4de0-a558-7fedc980db32</guid>
      <pubDate>Fri, 22 May 2009 02:33:00 -0700</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=31e8156d-2805-4de0-a558-7fedc980db32</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=31e8156d-2805-4de0-a558-7fedc980db32</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/05/Happy-birthday-VB-Migration-Partner-and-welcome-version-111-!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=31e8156d-2805-4de0-a558-7fedc980db32</wfw:commentRss>
    </item>
    <item>
      <title>Can your VB6 conversion tool handle null propagation?</title>
      <description>&lt;p&gt;
If you have massively used Variants in your VB6 apps, the migration to .NET might be a nightmare. The best that the Upgrade Wizard and other tools can do is translating each &amp;ldquo;As Variant&amp;rdquo; into &amp;ldquo;As Object&amp;rdquo;, on the assumption that the Object type can do everything that a Variant does. 
&lt;/p&gt;
&lt;p&gt;
You shouldn&amp;rsquo;t be surprised to learn that this is one of the false migration myths, or is a gross oversimplification of the truth, to say the least. In fact, the .NET Object type lacks what arguably is the most useful feature of Variants: &lt;strong&gt;support for Null values and Null propagation &lt;/strong&gt;in expressions. 
&lt;/p&gt;
&lt;p&gt;
Under VB6 a Variant variable can hold the special Null value and &amp;ndash; even more important &amp;ndash; all the string and math expression that involve a Null operand also deliver a Null Variant value. Virtually all database-intensive applications deal with Null values and have used null propagation to an extent. Now, let&amp;rsquo;s consider this VB6 code: 
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&lt;font color="#339966"&gt;&amp;#39; rs is an ADODB.Recordset&lt;/font&gt;&lt;br /&gt;
&lt;font color="#3366ff"&gt;Dim&lt;/font&gt; realPrice &lt;font color="#3366ff"&gt;As&lt;/font&gt; &lt;font color="#3366ff"&gt;Variant&lt;/font&gt;&lt;br /&gt;
realPrice = rs(&amp;quot;Price&amp;quot;)&lt;br /&gt;
realPrice = realPrice * (100 &amp;ndash; rs(&amp;quot;Discount&amp;quot;)) / 100&lt;br /&gt;
&lt;font color="#3366ff"&gt;If Not&lt;/font&gt; IsNull(realPrice) &lt;font color="#3366ff"&gt;Then&lt;/font&gt; DisplayPrice(realPrice)&lt;/font&gt; 
&lt;/p&gt;
&lt;p&gt;
Under VB6, if either the Price or the Discount field is Null, the realPrice variable is assigned Null and the DisplayPrice method isn&amp;rsquo;t invoked. Now, consider the &amp;ldquo;canonical&amp;rdquo; VB.NET version of the above code: 
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&lt;font color="#3366ff"&gt;Dim&lt;/font&gt; realPrice &lt;font color="#3366ff"&gt;As Object&lt;/font&gt;&lt;br /&gt;
realPrice = rs.Fields(&amp;quot;Price&amp;quot;).Value&lt;br /&gt;
realPrice = realPrice * (100 &amp;ndash; rs.Fields(&amp;quot;Discount&amp;quot;).Value) / 100&lt;br /&gt;
&lt;font color="#3366ff"&gt;If Not&lt;/font&gt; IsNull(realPrice) &lt;font color="#3366ff"&gt;Then&lt;/font&gt; DisplayPrice(realPrice)&lt;/font&gt; 
&lt;/p&gt;
&lt;p&gt;
Under .NET a Null database field returns a DBNull object &amp;ndash; more precisely, the DBNull.Value element. The problem is, no math or string operation is defined for the DBNull type, something I consider one of the most serious mistakes Microsoft made in this area. As a result, the third statement throws an exception if either field is Null. So long, functional equivalence! Welcome, migration head-aches! 
&lt;/p&gt;
&lt;p&gt;
Null propagation is a serious problem not to be underestimated. One of our customers has found that, on the average, one out of 40 statements uses Variant expression and relies on null propagation. To put things in the right perspective, in a middle-sized real-world application &lt;strong&gt;&lt;font color="#0000ff"&gt;you can expect to manually fix several thousand statements that use null propagation&lt;/font&gt;&lt;/strong&gt;. What&amp;rsquo;s worse, there is no simple way to work around Null values in VB.NET, short of splitting all statements in portion and testing each and every subexpression for the DBNull.Value value. 
&lt;/p&gt;
&lt;p&gt;
If you use VB Migration Partner, you can solve the above problem in the most elegant and painless way. Just use the following project-level pragmas: 
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier" color="#339966"&gt;&amp;nbsp;&amp;#39;## project:NullSupport&lt;br /&gt;
&amp;nbsp;&amp;#39;## project:ChangeType Variant, VB6Variant&lt;/font&gt; 
&lt;/p&gt;
&lt;p&gt;
The NullSupport pragma tells VB Migration Partner to map some VB library functions &amp;ndash; such as Left, Mid, Right, and a few others &amp;ndash; to special methods that are defined in VB Migration Partner&amp;rsquo;s support library and that, not surprisingly, correctly return a Null value if their argument is Null (as they do under VB6). 
&lt;/p&gt;
&lt;p&gt;
The ChangeType pragma converts all Variant members &amp;ndash; variable, fields, properties, methods, etc. &amp;ndash; as the special VB6Variant type (also defined in VB Migration Partner&amp;rsquo;s support library) which redefines all the math, comparison, string, and logical operators to support null values. 
&lt;/p&gt;
&lt;p&gt;
Yes, this is all you need to add null propagation support to your VB.NET code! This feature alone can save you literally weeks in a real-world migration project. And don&amp;rsquo;t forget that &lt;font color="#0000ff"&gt;&lt;strong&gt;VB Migration Partner is the only VB6 conversion software that supports Null values and Null propagation &lt;/strong&gt;&lt;font color="#000000"&gt;easily and automatically.&lt;/font&gt;&lt;/font&gt; 
&lt;/p&gt;
&lt;p&gt;
When you hear other vendors claiming that &amp;ldquo;&lt;em&gt;our tool uses advanced artificial-intelligence-based techniques to ensure functional equivalence with the original VB6 code&lt;/em&gt;&amp;rdquo;, just ask them how it deals with Null values. &lt;img src="/Blog/admin/pages/../tiny_mce/plugins/emotions/images/smiley-smile.gif" border="0" alt="Smile" title="Smile" width="18" height="18" /&gt; 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=KGDWoZeFQVY:fLVnVFz0lOI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=KGDWoZeFQVY:fLVnVFz0lOI:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/05/Can-your-VB6-conversion-tool-handle-null-propagation.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/05/Can-your-VB6-conversion-tool-handle-null-propagation.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=f2b455fe-c1fc-4a40-8eee-7951c035e70d</guid>
      <pubDate>Thu, 21 May 2009 03:13:00 -0700</pubDate>
      <category>VB.NET</category>
      <category>VB Migration Partner</category>
      <category>VB6</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=f2b455fe-c1fc-4a40-8eee-7951c035e70d</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=f2b455fe-c1fc-4a40-8eee-7951c035e70d</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/05/Can-your-VB6-conversion-tool-handle-null-propagation.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=f2b455fe-c1fc-4a40-8eee-7951c035e70d</wfw:commentRss>
    </item>
    <item>
      <title>Announcing release 1.11</title>
      <description>&lt;p&gt;
We at Code Architects have been working on the next release for a couple months now. It should have been released as version 1.10.05, but we have added so many important features that we decided to label it as version 1.11.
&lt;/p&gt;
&lt;p&gt;
Here&amp;#39;s a partial list of what you&amp;#39;ll find in the forthcoming version:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
	&lt;div&gt;
	smaller runtime library (about 1.66 MB) loads faster and takes less memory
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	improved support for Variants - our VB6Variant class now behaves &lt;u&gt;very&lt;/u&gt; closely to the original VB6 data type
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	better support for &amp;quot;B-string&amp;quot; functions, e.g. LeftB and InputB)
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	byref/byval semantics are correctly handled also in late-bound calls&amp;nbsp; &lt;em&gt;(more info in upcoming blog post)&lt;/em&gt;
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	better support for Japanese characters and resources
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	better support for ActiveX controls
	&lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
We should be releasing version 1.11&amp;nbsp;within the end of May.&amp;nbsp;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=mRwPLyGpOWE:5l-C3pkLzG8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=mRwPLyGpOWE:5l-C3pkLzG8:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/05/Announcing-release-111.aspx</link>
      <author>Admin</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/05/Announcing-release-111.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=ac1c5999-2d01-4a55-9c50-9158be01b558</guid>
      <pubDate>Mon, 11 May 2009 22:22:00 -0700</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=ac1c5999-2d01-4a55-9c50-9158be01b558</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=ac1c5999-2d01-4a55-9c50-9158be01b558</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/05/Announcing-release-111.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=ac1c5999-2d01-4a55-9c50-9158be01b558</wfw:commentRss>
    </item>
    <item>
      <title>[CASE STUDY] Migration of a 650,000 LOCs ERP system</title>
      <description>&lt;p&gt;
We&amp;#39;ve just published a case study of a migration carried out by SIS, an Austrian Microsoft partner who used VB Migration Partner to convert a middle-sized ERP system (about 650,000 lines of code), with a good assortment of challenges. The part that I like most is the following paragraph (the boldface is mine): 
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#0000ff"&gt;&lt;em&gt;During the software evaluation phase we run a 25K prototype through all
the conversion programs. &lt;strong&gt;It took 2.5 hours to get a compilable and
runnable VB.NET project with VB Migration Partner, and 13 hours with
its closest competitor&lt;/strong&gt;. The reduced effort, the ability to use pragmas
and support for the convert-test-fix were the main reasons for choosing
Code Architects&amp;rsquo; software. Later we discovered that their tech support
is also excellent. &lt;/em&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
It looks like VB Migration Partner allows you to convert VB6 apps to VB.NET &lt;strong&gt;about 5 times faster than its competitors. &lt;/strong&gt;Interestingly, the ratio is virtually the same also for larger, real-worlds apps - as you can ascertain by reading our competitors&amp;#39; case studies related to applications of comparable size. 
&lt;/p&gt;
&lt;p&gt;
You can read the entire story &lt;a href="http://www.vbmigration.com/Blog/casestudies/sis.aspx"&gt;here&lt;/a&gt;. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=HjI5jxDHp20:IuT4vLIx2h8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=HjI5jxDHp20:IuT4vLIx2h8:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/05/CASE-STUDY-Migration-of-a-650,000-LOCs-ERP-system.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/05/CASE-STUDY-Migration-of-a-650,000-LOCs-ERP-system.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=15216ae1-b9a4-480f-8f88-77a38a5dc4d4</guid>
      <pubDate>Sun, 03 May 2009 04:42:00 -0700</pubDate>
      <category>Migration cases</category>
      <category>VB Migration Partner</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=15216ae1-b9a4-480f-8f88-77a38a5dc4d4</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=15216ae1-b9a4-480f-8f88-77a38a5dc4d4</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/05/CASE-STUDY-Migration-of-a-650,000-LOCs-ERP-system.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=15216ae1-b9a4-480f-8f88-77a38a5dc4d4</wfw:commentRss>
    </item>
    <item>
      <title>VB Migration Partner speaks Japanese</title>
      <description>&lt;p&gt;
You can find Code Architects and VB Migration Partner mentioned in the &lt;a href="http://msdn.microsoft.com/ja-jp/vbasic/cc707251.aspx" target="_blank"&gt;VB Migration Center section&lt;/a&gt;, on Microsoft Japan&amp;#39;s MSDN web site. 
&lt;/p&gt;
&lt;p&gt;
From there you can find links to our Japanese &lt;a href="http://www.vbmigration.com/Blog/DefaultJP.aspx" target="_blank"&gt;home page&lt;/a&gt;&amp;nbsp;and to translated &lt;a href="http://www.infortech.co.jp/product/vbmp_overview.html" target="_blank"&gt;portions &lt;/a&gt;of our documentation.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=ENkZ-YVQz1w:wzP9x_sxcug:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=ENkZ-YVQz1w:wzP9x_sxcug:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/04/VB-Migration-Partner-speaks-Japanese.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/04/VB-Migration-Partner-speaks-Japanese.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=32a6fb7a-ff16-47f5-8230-a339647a8b41</guid>
      <pubDate>Fri, 24 Apr 2009 01:51:00 -0700</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=32a6fb7a-ff16-47f5-8230-a339647a8b41</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=32a6fb7a-ff16-47f5-8230-a339647a8b41</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/04/VB-Migration-Partner-speaks-Japanese.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=32a6fb7a-ff16-47f5-8230-a339647a8b41</wfw:commentRss>
    </item>
    <item>
      <title>[USER COMMENT] VB Migration Partner is the most productive migration software on the market</title>
      <description>&lt;p&gt;
We just received this comment from a customer:
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;An initial migration compared migration tools from six vendors.&lt;/strong&gt; It showed superior results for VB Migration Partner from Code Architects, which delivered fewer compilation and runtime errors than all its competitors. Its migration pragmas and the convert-test-fix methodology proved to be powerful and flexible enough to handle a large VB6 application (950K lines of code) with ease, the documentation is excellent, and Code Architects&amp;rsquo; tech support has always been very responsive. &lt;/font&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;font color="#0000ff"&gt;Dr. Otto J. Wiegele, CEO, SIS Datenverarbeitung GmbH&lt;/font&gt;&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
The boldface is mine, as I wanted to emphasize that our customer selected our VB Migration Partner after comparing as many as SIX competing products. They told us that they selected our software because it was &lt;strong&gt;&lt;font color="#0000ff"&gt;twice as productive &lt;/font&gt;&lt;/strong&gt;than the second item in the list.
&lt;/p&gt;
&lt;p&gt;
&amp;#39;nuff said!
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=nha3l5zIjGQ:XxZJgFarb_0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=nha3l5zIjGQ:XxZJgFarb_0:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/04/USER-COMMENT-VB-Migration-Partner-is-the-most-productive-migration-software-on-the-market.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/04/USER-COMMENT-VB-Migration-Partner-is-the-most-productive-migration-software-on-the-market.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=a80c48de-4083-42cb-898d-2b7ac0bb1c80</guid>
      <pubDate>Fri, 17 Apr 2009 02:22:00 -0700</pubDate>
      <category>Migration cases</category>
      <category>VB Migration Partner</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=a80c48de-4083-42cb-898d-2b7ac0bb1c80</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=a80c48de-4083-42cb-898d-2b7ac0bb1c80</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/04/USER-COMMENT-VB-Migration-Partner-is-the-most-productive-migration-software-on-the-market.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=a80c48de-4083-42cb-898d-2b7ac0bb1c80</wfw:commentRss>
    </item>
    <item>
      <title>[NEW RELEASE] Version 1.10.04 is available</title>
      <description>&lt;p&gt;
Last week we released VB Migration Partner 1.10.04. In addition to a few bug fixex, this new version features two new pragmas. 
&lt;/p&gt;
&lt;p&gt;
The new &lt;strong&gt;PreservePropertyAssignmentKind &lt;/strong&gt;pragma solves a problem that is inherent to the translation of VB6 properties that have a Get, Let, and Set block. This problem manifests itself in relatively few cases, and in fact no one has ever documented it before. Not surprisingly, the Upgrade Wizard and other VB migration tools suffer from this limitation. You can find more details &lt;a href="http://www.vbmigration.com/Blog/detknowledgebase.aspx?Id=597" target="_blank"&gt;here&lt;/a&gt;.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
The second pragma we added is &lt;strong&gt;SetPragmaPrefix&lt;/strong&gt;, which allows you to decide the valid prefix (or prefixes) for pragmas. It indirectly allows to enable and disable a group of pragmas inserted in code and can be very helpful in advanced scenarios. For example, you might want to try different approaches when migrating, and this pragma frees you from having to delete and insert many pragmas for each different scenario. (This is just an example: you&amp;#39;ll see the real power of this pragma in forthcoming releases.)
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=C3sJgkfFjqk:u7MwK2BrqyE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=C3sJgkfFjqk:u7MwK2BrqyE:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/03/Version-11004-is-available.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/03/Version-11004-is-available.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=617da1e4-745f-4b93-b51d-02ad26be2374</guid>
      <pubDate>Tue, 24 Mar 2009 19:34:00 -0700</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=617da1e4-745f-4b93-b51d-02ad26be2374</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=617da1e4-745f-4b93-b51d-02ad26be2374</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/03/Version-11004-is-available.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=617da1e4-745f-4b93-b51d-02ad26be2374</wfw:commentRss>
    </item>
    <item>
      <title>Accomplishing the impossible: VARPTR in VB.NET!</title>
      <description>&lt;p&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
&lt;w:WordDocument&gt;
&lt;w:View&gt;Normal&lt;/w:View&gt;
&lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
&lt;w:TrackMoves/&gt;
&lt;w:TrackFormatting/&gt;
&lt;w:PunctuationKerning/&gt;
&lt;w:ValidateAgainstSchemas/&gt;
&lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
&lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
&lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
&lt;w:DoNotPromoteQF/&gt;
&lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
&lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
&lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
&lt;w:Compatibility&gt;
&lt;w:BreakWrappedTables/&gt;
&lt;w:SnapToGridInCell/&gt;
&lt;w:WrapTextWithPunct/&gt;
&lt;w:UseAsianBreakRules/&gt;
&lt;w:DontGrowAutofit/&gt;
&lt;w:SplitPgBreakAndParaMark/&gt;
&lt;w:DontVertAlignCellWithSp/&gt;
&lt;w:DontBreakConstrainedForcedTables/&gt;
&lt;w:DontVertAlignInTxbx/&gt;
&lt;w:Word11KerningPairs/&gt;
&lt;w:CachedColBalance/&gt;
&lt;/w:Compatibility&gt;
&lt;m:mathPr&gt;
&lt;m:mathFont m:val="Cambria Math"/&gt;
&lt;m:brkBin m:val="before"/&gt;
&lt;m:brkBinSub m:val="&amp;#45;-"/&gt;
&lt;m:smallFrac m:val="off"/&gt;
&lt;m:dispDef/&gt;
&lt;m:lMargin m:val="0"/&gt;
&lt;m:rMargin m:val="0"/&gt;
&lt;m:defJc m:val="centerGroup"/&gt;
&lt;m:wrapIndent m:val="1440"/&gt;
&lt;m:intLim m:val="subSup"/&gt;
&lt;m:naryLim m:val="undOvr"/&gt;
&lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
&lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="267"&gt;
&lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;
&lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;
&lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;
&lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;
&lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;
&lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;
&lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;
&lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;
&lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/&gt;
&lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;
&lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;
&lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;
&lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;
&lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;
&lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;
&lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;
&lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;
&lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;
&lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;
&lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;
&lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;
&lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;
&lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;
&lt;!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:1;
mso-generic-font-family:roman;
mso-font-format:other;
mso-font-pitch:variable;
mso-font-signature:0 0 0 0 0 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1073750139 0 0 159 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin-top:0cm;
margin-right:0cm;
margin-bottom:10.0pt;
margin-left:0cm;
line-height:115%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
.MsoPapDefault
{mso-style-type:export-only;
margin-bottom:10.0pt;
line-height:115%;}
@page Section1
{size:612.0pt 792.0pt;
margin:70.85pt 2.0cm 2.0cm 2.0cm;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
--&gt;
&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0cm;
line-height:115%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"Times New Roman";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}
&lt;/style&gt;
&lt;![endif]--&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;VB6 supports three functions &amp;ndash; VarPtr, StrPtr, and ObjPtr &amp;ndash;
that were never officially supported by Microsoft, yet they have been
extensively used by many expert VB6 developers. In fact, you badly need these
functions when calling some especially complex Windows API functions. Of these
functions, the most useful one is VarPtr, which returns the address of the
memory location where the value of a variable is stored. &lt;/font&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;Neither the Upgrade Wizard nor any other VB6 migration tool
supports the VarPtr keyword, thus I decided that our VB Migration Partner *had*
to correctly convert it. Thanks to Google, I found out that the problem had
been discussed at length in many forums, but no definitive solution has ever
been found yet. You can write an implementation in unsafe C#, or an unmanaged
DLL written in C or Delphi, but these solution would force us to distribute a
separate DLL with VB.NET apps converted by VB Migration Partner, which I&amp;rsquo;d
rather not to.&lt;/font&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;It took a while and a lot of thinking, but in the end I
figure out a way to solve the problem. Yes, it is possible to write a VarPtr
function in plain VB.NET, with only the help of a method exposed by the Windows
API. Actually, you need just a few lines of code:&lt;/font&gt;
&lt;/p&gt;
&lt;p style="margin-bottom: 0.0001pt; line-height: normal" class="MsoNormal"&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: green"&gt;&amp;#39; -----------------------------------------------------------&lt;br /&gt;
&amp;#39; VARPTR
implementation in VB.NET&lt;br /&gt;
&amp;#39; Part of VB
Migration Partner&amp;rsquo;s support library&lt;br /&gt;
&amp;#39;&lt;br /&gt;
&amp;#39; Copyright &amp;copy;
2009, Francesco Balena &amp;amp; Code Architects&lt;br /&gt;
&amp;#39; -----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style="font-size: 9pt; line-height: 115%; font-family: 'Courier New'; color: blue"&gt;Module&lt;/span&gt;&lt;span style="font-size: 9pt; line-height: 115%; font-family: 'Courier New'"&gt; VarPtrSupport&lt;/span&gt;&lt;span style="font-size: 9pt; line-height: 115%"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;&amp;#39; a delegate that
can point to the VarPtrCallback method&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;Private&lt;/span&gt; &lt;span style="color: blue"&gt;Delegate&lt;/span&gt; &lt;span style="color: blue"&gt;Function&lt;/span&gt; VarPtrCallbackDelegate( _&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;ByVal&lt;/span&gt; address &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;, &lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;ByVal&lt;/span&gt;
unused1 &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;,
&lt;span style="color: blue"&gt;_&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ByVal&lt;/span&gt; unused2 &lt;span style="color: blue"&gt;As&lt;/span&gt;
&lt;span style="color: blue"&gt;Integer&lt;/span&gt;, &lt;span style="color: blue"&gt;ByVal&lt;/span&gt;
unused3 &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;)&amp;nbsp;&lt;span&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;&amp;#39; two aliases for
the CallWindowProcA Windows API method&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: green"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39; notice that 2nd argument is passed
by-reference&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Private&lt;/span&gt; &lt;span style="color: blue"&gt;Declare&lt;/span&gt; &lt;span style="color: blue"&gt;Function&lt;/span&gt; CallWindowProc
&lt;span style="color: blue"&gt;Lib&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;user32&amp;quot;&lt;/span&gt;
&lt;span style="color: blue"&gt;_&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Alias&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;CallWindowProcA&amp;quot;&lt;/span&gt;
_&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(&lt;span style="color: blue"&gt;ByVal&lt;/span&gt;
wndProc &lt;span style="color: blue"&gt;As&lt;/span&gt; VarPtrCallbackDelegate, &lt;span style="color: blue"&gt;ByRef&lt;/span&gt; var &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Short&lt;/span&gt;, _&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;ByVal&lt;/span&gt;
unused1 &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;,
&lt;span style="color: blue"&gt;ByVal&lt;/span&gt; unused2 &lt;span style="color: blue"&gt;As&lt;/span&gt;
&lt;span style="color: blue"&gt;Integer&lt;/span&gt;,&amp;nbsp;
_&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;ByVal&lt;/span&gt;
unused3 &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;) &lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Private&lt;/span&gt; &lt;span style="color: blue"&gt;Declare&lt;/span&gt; &lt;span style="color: blue"&gt;Function&lt;/span&gt; CallWindowProc&lt;span style="color: blue"&gt; Lib&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;user32&amp;quot;&lt;/span&gt;
_&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;Alias&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;CallWindowProcA&amp;quot;&lt;/span&gt;
_&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(&lt;span style="color: blue"&gt;ByVal&lt;/span&gt;
wndProc &lt;span style="color: blue"&gt;As&lt;/span&gt; VarPtrCallbackDelegate, &lt;span style="color: blue"&gt;ByRef&lt;/span&gt; var &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;, _&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;ByVal&lt;/span&gt;
unused1 &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;,
&lt;span style="color: blue"&gt;ByVal&lt;/span&gt; unused2 &lt;span style="color: blue"&gt;As&lt;/span&gt;
&lt;span style="color: blue"&gt;Integer&lt;/span&gt;,
_&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;ByVal&lt;/span&gt;
unused3 &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer) &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: green"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39; ...add more overload to support other data
types...&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;&amp;#39; the method that
is indirectly executed when calling CallVarPtrSupport &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: green"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39; notice that 1st argument is declared
by-value (this is the&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39; argument that receives the
2nd value passed to CallVarPtrSupport)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Private&lt;/span&gt; &lt;span style="color: blue"&gt;Function&lt;/span&gt;
VarPtrCallback(&lt;span style="color: blue"&gt;ByVal&lt;/span&gt; address &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;, _&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;ByVal&lt;/span&gt; unused1 &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;, &lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;ByVal&lt;/span&gt;
unused2 &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;,
&lt;span style="color: blue"&gt;_&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ByVal&lt;/span&gt; unused3 &lt;span style="color: blue"&gt;As&lt;/span&gt;
&lt;span style="color: blue"&gt;Integer&lt;/span&gt;) &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Return&lt;/span&gt;
address&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;End&lt;/span&gt; &lt;span style="color: blue"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 6pt; font-family: 'Courier New'; color: blue"&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;&amp;#39; two overloads of
VarPtr&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Public&lt;/span&gt; &lt;span style="color: blue"&gt;Function&lt;/span&gt; VarPtr(&lt;span style="color: blue"&gt;ByRef&lt;/span&gt;
var &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Short&lt;/span&gt;) &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Return&lt;/span&gt;
CallWindowProc(&lt;span style="color: blue"&gt;AddressOf&lt;/span&gt; VarPtrCallback, var,
0, 0, 0)&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;End&lt;/span&gt; &lt;span style="color: blue"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Public&lt;/span&gt; &lt;span style="color: blue"&gt;Function&lt;/span&gt; VarPtr(&lt;span style="color: blue"&gt;ByRef&lt;/span&gt;
var &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;)
&lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Return&lt;/span&gt;
CallWindowProc(&lt;span style="color: blue"&gt;AddressOf&lt;/span&gt; VarPtrCallback, var,
0, 0, 0)&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;End&lt;/span&gt; &lt;span style="color: blue"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: green"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39; ...add more overload to support other data
types...&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style="font-size: 9pt; line-height: 115%; font-family: 'Courier New'; color: blue"&gt;End Module&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;To understand how the trick works, let&amp;rsquo;s see what happens when
you call the VarPtr method. The only line of code in this method invokes one of
the overloads of CallWindowProc method. The CallWindowProc method takes five
arguments, the first one of which is a delegate that must point to a method
that takes four 32-bit values. CallWindowProc invokes the method pointed to by
the delegate and passed the other four values to such a method.&lt;/font&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;The key point in this mechanism is that each CallWindowProc
overload takes a value by-reference in its second argument &amp;ndash; a Short and an
Integer, respectively. This means that the CallWindowProc method (buried inside
the User32.dll) receives the &lt;em&gt;address&lt;/em&gt;
of the Short or Integer variable. This address is a 32-bit integer and is
passed verbatim to the VarPtrCallback method. This method in turn receives a
32-bit integer value with by-value semantics, which means that the &lt;em&gt;address&lt;/em&gt; parameter now contains whatever
value was pushed on the stack by the CallWindowProc method.&lt;/font&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;Let&amp;rsquo;s quickly recap: the VarPtr method pushes the address of
the Short or Integer variable &amp;ndash; that is, the value we are interested in &amp;ndash; on
the stack. This 32-bit integer is received by the CallWindowProc method (in
User32.dll) and is sent to the VarPtrCallback method, which receives it in its
first argument and returns it verbatim to the CallWindowProc method, which in
turn returns it to the VarPtr method that can finally return it to the caller.&lt;/font&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;Notice that you might need to add more overloads for the
VarPtr method (and the CallWindowProc method), to support data types other than
Short or Integer. Just remember that you can&amp;rsquo;t use this technique with String,
Objects, or other reference types. It doesn&amp;rsquo;t work with Boolean values, either.&lt;/font&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;Interestingly, you can use the VarPtr method with
structures, provided that the structure doesn&amp;rsquo;t contain any String, Object, or Boolean
elements. To get the address of a structure just use VarPtr on its first
element, as in this example:&lt;/font&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;Structure&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt; POINTAPI&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Public&lt;/span&gt; x &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Public&lt;/span&gt; y &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;End&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt; &lt;span style="color: blue"&gt;Structure&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;&lt;br /&gt;
&lt;br /&gt;
Dim&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt; pnt &lt;span style="color: blue"&gt;As&lt;/span&gt; POINTAPI&lt;/span&gt;&lt;span style="font-size: 6pt; font-family: 'Courier New'; color: blue"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;Dim&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt; addr &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt; =
VarPtr(pnt.x)&lt;/span&gt;&lt;span style="font-size: 6pt; font-family: 'Courier New'; color: blue"&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;To prove that the VarPtr function works correctly, let&amp;rsquo;s use
it together with the CopyMemory Windows API method to delete an element in an
array by quickly shifting all the elements towards lower indices:&lt;/font&gt;
&lt;/p&gt;
&lt;p style="margin-bottom: 0.0001pt; line-height: normal" class="MsoNormal"&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;Declare&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt; &lt;span style="color: blue"&gt;Sub&lt;/span&gt;
CopyMemory &lt;span style="color: blue"&gt;Lib&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;Kernel32.dll&amp;quot;&lt;/span&gt;
&lt;span style="color: blue"&gt;Alias&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;RtlMoveMemory&amp;quot;&lt;/span&gt;
_&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(&lt;span style="color: blue"&gt;ByVal&lt;/span&gt; dest &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;, &lt;span style="color: blue"&gt;ByVal&lt;/span&gt; source &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;ByVal&lt;/span&gt;
numBytes &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;)&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;&lt;br /&gt;
&lt;br /&gt;
Sub&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt; Main()&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Dim&lt;/span&gt;
arr(1000) &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;&amp;#39; initialize the
array&lt;/span&gt;&lt;span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;For&lt;/span&gt; n &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt; = 0 &lt;span style="color: blue"&gt;To&lt;/span&gt; UBound(arr) : arr(n) = n : &lt;span style="color: blue"&gt;Next&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;&amp;#39; ...&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;&amp;#39; delete first
element by shifting all elements towards the beginning &lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;&amp;#39; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span style="color: green"&gt;of the array, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;span style="color: green"&gt;then clear last
element&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;CopyMemory(VarPtr(arr(0)), VarPtr(arr(1)), UBound(arr)
* 4)&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;arr(UBound(arr)) = 0&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;&amp;#39; check that it
worked fine&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;For&lt;/span&gt; n &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt; = 0 &lt;span style="color: blue"&gt;To&lt;/span&gt; UBound(arr) - 1&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;If&lt;/span&gt; arr(n)
&amp;lt;&amp;gt; n + 1 &lt;span style="color: blue"&gt;Then&lt;/span&gt; Debug.Print(&lt;span style="color: #a31515"&gt;&amp;quot;Wrong value at index {0}&amp;quot;&lt;/span&gt;, n)&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;Next&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;End Sub&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;In case you are wondering why you should use CopyMemory and
VarPtr to shift all the elements of an array &amp;ndash; instead of a plain For &amp;hellip; Next
loop &amp;ndash; the answer is: execution speed. Under VB6 this technique was often used
to significantly speed up array operations; the VB.NET compiler produces more
efficient code and this technique is seldom necessary, nevertheless the ability
to convert this code from VB6 without any major edits means that you don&amp;rsquo;t have
to spend too much time trying to understand what the VB6 developer meant to do.
&lt;/font&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;Please notice that this implementation of VarPtr &lt;strong&gt;works well in 32-bit applications only&lt;/strong&gt;, and fails when running on 64-bit operating systems. To ensure that things work as expected and that 32-bit code is generated even when running on 64-bit versions of Windows, you must select the Target CPU = x86 option in the Advanced Compile Options dialog box, in the Compile tab of the My Project page. (Odds are that you have to select this option anyway when doing complex operations with pointers.)&lt;br /&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Important warnings&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;: &lt;font size="2"&gt;working with memory addresses under .NET can be &lt;/font&gt;&lt;font size="2" color="#ff0000"&gt;&lt;strong&gt;very &lt;/strong&gt;&lt;/font&gt;&lt;font size="2"&gt;dangerous, much more dangerous than under VB6. The reason is, the garbage collector can fire virtually anytime while the program is executing, therefore the address of an object can suddenly change and the unmanaged method (CopyMemory in above example) would receive the address of a memory area that doesn&amp;#39;t contain the data any longer. The neat result would be either a wrong value or an application crash. When using this implementation of VarPtr under VB.NET keep the following points into account:&lt;/font&gt;
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;font size="2"&gt;VarPtr is absolutely safe only when used to return the address of &lt;strong&gt;simple local variables&lt;/strong&gt;, such as Short, Integer, Single, Double, or Date variables. Using local variables is safe because local variables are allocated on the stack and don&amp;#39;t move even if an unexpected garbage collection occurs immediately after the VarPtr method returns but before the unmanaged method complete its execution. &lt;br /&gt;
	&lt;/font&gt;&lt;/li&gt;
	&lt;li&gt;&lt;font size="2"&gt;Passing the element of a Structure is safe, but only if the Structure is held in a local variable (as opposed to a class field) &lt;/font&gt;&lt;/li&gt;
	&lt;li&gt;&lt;font size="2"&gt;In all other cases, VarPtr isn&amp;#39;t&amp;nbsp; 100% safe and might occasionally deliver wrong results or crash the application. For example, it isn&amp;#39;t 100% safe to pass VarPtr a class field or an element of an array, because array elements are stored in the managed heap and can be moved by the garbage collector (regardless of whether the array is stored in a local variable).&amp;nbsp;&lt;/font&gt;&lt;/li&gt;
	&lt;li&gt;&lt;font size="2"&gt;In a single-thread application the probability that a garbage collection occurs unexpectedly are very low and might even be considered as negligible, but they can&amp;#39;t be considered as equal to zero. &lt;br /&gt;
	&lt;/font&gt;&lt;/li&gt;
	&lt;li&gt;&lt;font size="2"&gt;You can further minimize the probability of an unexpected GC by avoiding calling methods and language functions (e.g. Left, Int, Abs) inside the call to the unamanged method but, again, &lt;em&gt;you can&amp;#39;t reduce this probability to zero&lt;/em&gt;. &lt;/font&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;To recap, except when you are in cases #1 and #2 above, the converted code will work &lt;em&gt;most of the time&lt;/em&gt;, but it can&amp;#39;t be guaranteed to work &lt;em&gt;always&lt;/em&gt;.The only documented way to ensure that an object doesn&amp;#39;t move in memory because of unexpected gargabe collection is by &lt;strong&gt;&lt;em&gt;pinning &lt;/em&gt;&lt;/strong&gt;the object, by means of methods exposed by the &lt;strong&gt;System.Runtime.InteropServices.Marshal &lt;/strong&gt;class. &lt;/font&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;Even with this limitation, the VB.NET implementation VarPtr method is quite helpful when doing a quick-and-dirty migration - using VB Migration Partner or the Upgrade Wizard. You can use VarPtr to check that the converted code works as intended, but it is strongly recommended that you get rid of VarPtr before going to production. In the CopyMemory case see above, for example, you can do without the VarPtr by using a different overload of the CopyMemory method that takes by-reference arguments:&lt;br /&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;Declare&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'"&gt; &lt;span style="color: blue"&gt;Sub&lt;/span&gt;
CopyMemoryByref &lt;span style="color: blue"&gt;Lib&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;Kernel32.dll&amp;quot;&lt;/span&gt;
&lt;span style="color: blue"&gt;Alias&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;RtlMoveMemory&amp;quot;&lt;/span&gt;
_&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(&lt;span style="color: blue"&gt;ByRef&lt;/span&gt; dest &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;, &lt;span style="color: blue"&gt;ByRef&lt;/span&gt; source &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;ByVal&lt;/span&gt;
numBytes &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;)&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;(This code works because the .NET Framework automatically pins every object passed by reference to an external method.)&lt;/font&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;font size="2"&gt;Even better, you should do your best to avoid unamanged calls altogether and replace them with calls to methods of pure .NET objects. &lt;br /&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;span style="font-size: 9pt; font-family: 'Courier New'; color: blue"&gt;&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=pW-7BcwZHCI:NiUnxYmJAPI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=pW-7BcwZHCI:NiUnxYmJAPI:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/03/Accomplishing-the-impossible-VARPTR-in-VBNET!.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/03/Accomplishing-the-impossible-VARPTR-in-VBNET!.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=77c3b470-1609-4bb7-becd-3e3767e1afca</guid>
      <pubDate>Sun, 15 Mar 2009 20:39:00 -0700</pubDate>
      <category>VB.NET</category>
      <category>Optimization</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=77c3b470-1609-4bb7-becd-3e3767e1afca</pingback:target>
      <slash:comments>15</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=77c3b470-1609-4bb7-becd-3e3767e1afca</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/03/Accomplishing-the-impossible-VARPTR-in-VBNET!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=77c3b470-1609-4bb7-becd-3e3767e1afca</wfw:commentRss>
    </item>
    <item>
      <title>All the white papers in one place</title>
      <description>&lt;p&gt;
We just put online a new page that gathers &lt;a href="http://www.vbmigration.com/Blog/whitepapers/"&gt;all the whitepapers&lt;/a&gt; we have published so far, and the ones that will be in the future. 
&lt;/p&gt;
&lt;p&gt;
If you need guidance when selecting a conversion tool or a migration strategy, this is the place to go.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=Fpl5sRKXTR8:k2gXFrdZh1c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=Fpl5sRKXTR8:k2gXFrdZh1c:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/02/All-the-white-papers-in-one-place.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/02/All-the-white-papers-in-one-place.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=acf22f10-184e-48a1-897e-73077fa747c2</guid>
      <pubDate>Sat, 21 Feb 2009 21:57:00 -0700</pubDate>
      <category>VB Migration Partner</category>
      <category>VB6</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=acf22f10-184e-48a1-897e-73077fa747c2</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=acf22f10-184e-48a1-897e-73077fa747c2</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/02/All-the-white-papers-in-one-place.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=acf22f10-184e-48a1-897e-73077fa747c2</wfw:commentRss>
    </item>
    <item>
      <title>[NEW RELEASE] Version 1.10.03 is online</title>
      <description>&lt;p&gt;
This new version differs from previous 1.10.02 only for the release number, yet several important new features have been added.
&lt;/p&gt;
&lt;p&gt;
First , the new ThreadSafe pragma allows VB Migration Partner to generate .NET DLLs that are ready for multi-threading environments, such as DLLs meant to be used by ASP.NET clients. You can read more about this topic in a &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2009/02/Subtle-threading-issues-and-how-to-fix-them-(automatically)-with-VB-Migration-Partner.aspx" target="_blank"&gt;previous post&lt;/a&gt; and &lt;a href="http://www.vbmigration.com/Blog/detknowledgebase.aspx?Id=591" target="_blank"&gt;this KB article&lt;/a&gt;.Next, we have implemented a simple but effective mechanism for reducing startup time in complex N-tier applications consisting of dozens or hundreds DLLs. You can find more details &lt;a href="http://www.vbmigration.com/Blog/detknowledgebase.aspx?Id=590" target="_blank"&gt;here&lt;/a&gt;. Finally, we now provide a &lt;a href="http://www.vbmigration.com/Blog/detknowledgebase.aspx?Id=592" target="_blank"&gt;simple mechanism&lt;/a&gt; to let VB Migration Partner know whether a Variant variable is expected to contain a scalar value or an object. This information is used by VB Migration Partner to generate better code.
&lt;/p&gt;
&lt;p&gt;
Registered users can download the new version using the command in the Help menu. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=2ofESTGdCfg:O6L8PNDWkWI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=2ofESTGdCfg:O6L8PNDWkWI:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/02/NEW-RELEASE-Version-11003-is-online.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/02/NEW-RELEASE-Version-11003-is-online.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=daa8bc84-b2e1-40cf-aeac-94d0e0b86b29</guid>
      <pubDate>Sun, 15 Feb 2009 20:52:00 -0700</pubDate>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=daa8bc84-b2e1-40cf-aeac-94d0e0b86b29</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=daa8bc84-b2e1-40cf-aeac-94d0e0b86b29</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/02/NEW-RELEASE-Version-11003-is-online.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=daa8bc84-b2e1-40cf-aeac-94d0e0b86b29</wfw:commentRss>
    </item>
    <item>
      <title>[WHITEPAPER] Tips for smooth migration of calls to Windows API methods</title>
      <description>&lt;p&gt;
There many ways to skin a cat, as they say, and there are at least as many ways to convert a Windows API call from VB6 to VB.NET.
&lt;/p&gt;
&lt;p&gt;
In general , you don&amp;#39;t have to worryabout Declare statements and Windows API calls when migrating a VB6 project to VB.NET - if you are using VB Migration Partner, at least - because our tool can handle correctly even very contorted cases and can even fix a few subtle issues caused by peculiar .NET features like string immutability and orphaned delegates. However, at time you need to get your hands dirty and pay a lot of attention to API calls.
&lt;/p&gt;
&lt;p&gt;
We have prepared a short but juicy technical whitepaper entitled &lt;a href="http://www.vbmigration.com/Blog/whitepapers/apicalls.aspx"&gt;&lt;strong&gt;Tips for smooth migration of calls to Windows API methods&lt;/strong&gt;&lt;/a&gt;. Among the other things, this article shows how you can wrap API calls in methods and then replace these wrapper methods with calls to native .NET objects, so that in the end you have no dependencies on unmanaged code.
&lt;/p&gt;
&lt;p&gt;
While speaking of API calls, here a few other articles that you might find useful: 
&lt;/p&gt;
&lt;p&gt;
&lt;span class="KB_TipoItem"&gt;[PRB]
&lt;/span&gt;&lt;a href="http://www.vbmigration.com/Blog/detknowledgebase.aspx?Id=52"&gt;
A call to a Windows API Declare returns a string filled with spaces&lt;span class="KB_TipoItem"&gt;&lt;br /&gt;
[PRB]
&lt;/span&gt;&lt;/a&gt;&lt;a href="http://www.vbmigration.com/Blog/detknowledgebase.aspx?Id=119"&gt;
Calls to GetOpenFileName API method returns trimmed string&lt;br /&gt;
&lt;/a&gt;&lt;span class="KB_TipoItem"&gt;[INFO]
&lt;/span&gt;&lt;a href="http://www.vbmigration.com/Blog/detknowledgebase.aspx?Id=57"&gt;
Declare statements can generate methods with different names &lt;br /&gt;
&lt;/a&gt;&lt;span class="KB_TipoItem"&gt;[HOWTO]
&lt;/span&gt;&lt;a href="http://www.vbmigration.com/Blog/detknowledgebase.aspx?Id=58"&gt;
Migrate VB6 applications that use window subclassing &lt;br /&gt;
&lt;/a&gt;&lt;span class="KB_TipoItem"&gt;[PRB]
&lt;/span&gt;&lt;a href="http://www.vbmigration.com/Blog/detknowledgebase.aspx?Id=51"&gt;
VB6 applications that use window subclassing or other API callback
methods throw a CallbackOnCollectedDelegate excetion&amp;nbsp; &lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=la0NEZiqS6M:Ljm6O59QHQg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=la0NEZiqS6M:Ljm6O59QHQg:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/02/WHITEPAPER-Tips-for-smooth-migration-of-calls-to-Windows-API-methods.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/02/WHITEPAPER-Tips-for-smooth-migration-of-calls-to-Windows-API-methods.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=98b297c9-c4b6-465a-ae5c-c176627b739f</guid>
      <pubDate>Wed, 11 Feb 2009 23:46:00 -0700</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=98b297c9-c4b6-465a-ae5c-c176627b739f</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=98b297c9-c4b6-465a-ae5c-c176627b739f</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/02/WHITEPAPER-Tips-for-smooth-migration-of-calls-to-Windows-API-methods.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=98b297c9-c4b6-465a-ae5c-c176627b739f</wfw:commentRss>
    </item>
    <item>
      <title>Subtle threading issues and how to fix them (automatically) with VB Migration Partner</title>
      <description>&lt;p&gt;
One customers brought an issue to our attention. He was using a migrated VB.NET component in a heavy multi-threaded environment (the component is called by ASP.NET pages) and found that occasionally the program crashed with an unexplainable error message. A quick look at the stack trace confirmed the initial suspect: the error was caused by two threads that initiates a call to the same method at the same time. We have fixed the problem in our library in a few minutes (the fix will appear in version 1.10.03, due in a few days), but we realized that the problem isn&amp;#39;t confined to our library. To explain why, a short digression is in order.
&lt;/p&gt;
&lt;p&gt;
VB6 components use Single-Threaded Apartment (STA) model: each thread lives in an &amp;ldquo;apartment&amp;rdquo; of its own. In plain English, this means that each thread works with a different set of global variables. For example, assume that the ActiveX DLL project contains a BAS module with the following variable declaration:&lt;br /&gt;
&lt;br /&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39; ...(in the UserInfo.bas file)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public UserName As String&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
Thanks to STA threading model, each client &amp;ndash; running in a different thread &amp;ndash; can write this variable and read it back, without worrying about another client (in another thread) overwriting the variable with a different value. As you see, STA makes multi-threading programming virtually as easy as single-thread (i.e. traditional) programming. Of course,when writing multi-threaded apps you have to take care of many other potential concurrency issues &amp;ndash; for example, two threads working on the same temporary file or registry key &amp;ndash; but at least you don&amp;rsquo;t need to worry about global variables.&lt;br /&gt;
&lt;br /&gt;
By contrast, components written in VB.NET &amp;ndash; and all .NET languages, for that matter &amp;ndash; use free-threading, which means that all threads can access all variables at the same time. Therefore, the VB.NET component exposes the same UserName field to all threads, which means that any thread can overwrite the value stored there by another thread. &lt;br /&gt;
&lt;br /&gt;
To simplify programming in free-threaded contests, the .NET Framework supports the ThreadStatic attribute. You can apply this attribute only to static class fields &amp;ndash; either fields defined in modules or fields defined in classes and marked with the Shared kewword:&lt;br /&gt;
&lt;font face="courier new,courier"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ThreadStatic()&amp;gt; _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public UserName As String&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
All fields marked with the ThreadStatic attribute are stored in the Thread Local Storage (TLS) area. The separation among threads is automatic, because each thread owns a different TLS. &lt;br /&gt;
&lt;br /&gt;
In theory, when migrating a VB6 DLL meant to be used by free-threaded clients, you should scrutinize each and every variable in BAS modules and decide whether to tag them with the ThreadStatic attribute. To make this task as easy as possible, as well as to avoid any manual edit of the resulting VB.NET code, starting with version 1.10.03 VB Migration Partner supports the &lt;strong&gt;ThreadSafe &lt;/strong&gt;pragma, which can be applied at the project-, file-, method- and variable-level scope. In most cases, therefore, all you need to do is using a single pragma that affects all the variables in the current project:&lt;br /&gt;
&lt;font face="courier new,courier"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;## project:ThreadSafe True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public UserName As String&lt;/font&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=F3DYmWK_ckw:c18wh_JBF00:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=F3DYmWK_ckw:c18wh_JBF00:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/02/Subtle-threading-issues-and-how-to-fix-them-(automatically)-with-VB-Migration-Partner.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/02/Subtle-threading-issues-and-how-to-fix-them-(automatically)-with-VB-Migration-Partner.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=15d2e72c-0a2c-4d57-9bcb-d2653195bf20</guid>
      <pubDate>Tue, 10 Feb 2009 03:09:00 -0700</pubDate>
      <category>VB.NET</category>
      <category>VB Migration Partner</category>
      <category>VB6</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=15d2e72c-0a2c-4d57-9bcb-d2653195bf20</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=15d2e72c-0a2c-4d57-9bcb-d2653195bf20</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/02/Subtle-threading-issues-and-how-to-fix-them-(automatically)-with-VB-Migration-Partner.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=15d2e72c-0a2c-4d57-9bcb-d2653195bf20</wfw:commentRss>
    </item>
  </channel>
</rss>
