{"id":913,"date":"2010-02-26T17:22:00","date_gmt":"2010-02-26T17:22:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vbteam\/2010\/02\/26\/on-the-blink-matt-gertz\/"},"modified":"2024-07-05T12:41:45","modified_gmt":"2024-07-05T19:41:45","slug":"on-the-blink-matt-gertz","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/vbteam\/on-the-blink-matt-gertz\/","title":{"rendered":"On The Blink (Matt Gertz)"},"content":{"rendered":"<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">One of the really fun things about being associated with the Visual Basic team is getting to see all of the varied usages to which our customers put it.<span>&nbsp; <\/span>From enterprise software to games, our customer base covers a wide range.<span>&nbsp; <\/span>The most fun to see, however, are the hobby applications, because the writers of that code come up with some pretty off-the-wall (but very cool) uses for it.<\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\" face=\"Calibri\">Case in point:<span>&nbsp; <\/span>I was contacted two weeks ago by a gentleman named David Swoboda (name used with permission), who was working on a magic trick that required him to blink the LED on an old iPac smart device.<span>&nbsp; <\/span>He&rsquo;d found a couple of C++ APIs <\/font><a href=\"http:\/\/windowsmobiledn.com\/how-to-control-the-led-of-your-pocket-pc\/\"><font size=\"3\" face=\"Calibri\">here<\/font><\/a><font size=\"3\"><font face=\"Calibri\"> that would do the trick, and he was wondering if I could help him translate it to VB so that he could use it at his next magician&rsquo;s meeting.<\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">I was intrigued, so I set about looking at the APIs that David had pointed me to.<span>&nbsp; <\/span>We iterated over the best solution in e-mail and, with work on both sides, came up with what follows. <\/p>\n<p><\/font><\/font><\/p>\n<h2><font size=\"4\"><font color=\"#4f81bd\"><font face=\"Cambria\">LED through the code<\/p>\n<p><\/font><\/font><\/font><\/h2>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">The functionality is contained in the coredll.dll library on the device, and although the prototypes aren&rsquo;t given in the SDK (as noted in the link above), the APIs are listed as:<\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\"><code><span>BOOL NLedGetDeviceInfo(INT nID, PVOID pOutput);<\/span><\/code><span><br \/><code>BOOL NLedSetDevice(INT nID, PVOID pOutput);<\/code><\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">These APIs work by passing in an integer which indicates what information was being asked for as well as memory in which to store the answer.<span>&nbsp;&nbsp; <\/span>The size and shape of the memory (actually, a structure) varies based on the integer, but in David&rsquo;s case he just needed to support one structure for each API, so that nothing too complicated was needed.<\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">I could translate these using either Declare statements or DllImport attributes.<span>&nbsp; <\/span>I&rsquo;ve done the former several times in my blog posts, so I decided to do the latter.<span>&nbsp; <\/span>That, in turn, requires me to import that namespace:<\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>Import <\/span><span>System.Runtime.InteropServices<\/span><span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\"><span>So, for the first API, I&rsquo;ll indicate that we are going to import from the appropriate DLL:<\/span><\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>&lt;System.Runtime.InteropServices.<span>DllImport<\/span>(<span>&#8220;coredll.dll&#8221;<\/span>)&gt; _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><font face=\"Calibri\">This is a function that I&rsquo;m pulling from the DLL, and it isn&rsquo;t part of a class, so that leads us to:<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>Private<\/span><span> <span>Shared<\/span> <span>Function<\/span> NLedGetDeviceInfo( _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><font face=\"Calibri\">The first argument is an INT, which these days is defined as a 32-bit integer.&nbsp; Thus, we get:<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>ByVal<\/span><span> nID <span>As<\/span> <span>Integer<\/span>, _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\" face=\"Calibri\">The second argument is a PVOID.&nbsp; Now, a PVOID is simply a pointer to an arbitrary structure &ndash; kind of like referring to a class as an Object type instead of its own specific type, but not exactly.&nbsp; The nature of the structure will vary based on the nID that we specified in the last step, but in David&rsquo;s case I knew exactly what kind of structure he&rsquo;d need to call, since his needs were simple. <span>&nbsp;<\/span>Let&rsquo;s call the structure NLED_COUNT_INFO (as it&rsquo;s called in the C++ case), and we&rsquo;ll define it later.<span>&nbsp; <\/span>The structure must be passed ByRef, since it will be modified (see <\/font><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/awbckfbz.aspx\"><font size=\"3\" face=\"Calibri\">this link<\/font><\/a><font size=\"3\"><font face=\"Calibri\">), so:<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>ByRef<\/span><span> pOutput <span>As<\/span> <span>NLED_COUNT_INFO<\/span>) _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><font face=\"Calibri\">And then we finish off the signature by noting that this will return a Boolean:<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>As<\/span><span> <span>Boolean<\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>End<\/span> <span>Function<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><font face=\"Calibri\">Similarly, the prototype for the other call will be:<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; &lt;System.Runtime.InteropServices.<span>DllImport<\/span>(<span>&#8220;coredll.dll&#8221;<\/span>)&gt; _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>Private<\/span> <span>Shared<\/span> <span>Function<\/span> NLedSetDevice(<span>ByVal<\/span> nID <span>As<\/span> <span>Integer<\/span>, _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>ByRef<\/span><span> pOutput <span>As<\/span> <span>NLED_SETTINGS_INFO<\/span>) <span>As<\/span> <span>Boolean<\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>End<\/span> <span>Function<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><font face=\"Calibri\">Now we have to deal with the structures that will be passed in, but those map pretty well to VB.&nbsp; There are two different structures that we care about, based on the interesting constants:<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>Const <\/span><span>NLED_COUNT_INFO_ID <span>As Integer <\/span>= 0<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Const <\/span><span>NLED_SETTINGS_INFO_ID <span>As Integer <\/span>= 2<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><font face=\"Calibri\">The original C++ structures are (as given in MSDN):<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>struct NLED_COUNT_INFO {<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp; UINT cLeds; <\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>};<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>struct NLED_SETTINGS_INFO {<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp; UINT LedNum;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp; INT OffOnBlink;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp; LONG TotalCycleTime;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp; LONG OnTime;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp; LONG OffTime;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp; INT MetaCycleOn;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp; INT MetaCycleOff; <\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>};<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><font face=\"Calibri\">Which in turn are, for VB:<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; &lt;Runtime.InteropServices.StructLayout(LayoutKind.Sequential)&gt; _<\/p>\n<p><\/span><\/p>\n<p class=\"Ms\noNormal\"><span>&nbsp;&nbsp;&nbsp; <span>Private<\/span> <span>Structure<\/span> NLED_COUNT_INFO<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Dim<\/span> cLeds <span>As<\/span> <span>UInteger<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>End<\/span> <span>Structure<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; &lt;Runtime.InteropServices.StructLayout(LayoutKind.Sequential)&gt; _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>Private<\/span> <span>Structure<\/span> NLED_SETTINGS_INFO<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Dim<\/span> LedNum <span>As<\/span> <span>UInteger<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Dim<\/span> OffOnBlink <span>As<\/span> <span>Integer<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Dim<\/span> TotalCycleTime <span>As<\/span> <span>Integer<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Dim<\/span> OnTime <span>As<\/span> <span><span>Integer<\/p>\n<p><\/span><\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Dim<\/span> OffTime <span>As<\/span> <span>Integer<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Dim<\/span> MetaCycleOn <span>As<\/span> <span>Integer<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Dim<\/span> MetaCycleOff <span>As<\/span> <span>Integer<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>End<\/span> <span>Structure<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\">\n<p><font size=\"3\" face=\"Calibri\">[EDIT:&nbsp; As I was reminded in the comments, LONG translates to a 32-bit&nbsp;Integer and not Long on 32-bit systems (in this case, fundementally equivalent to INT), and I have therefore changed the translation appropriately above.]<\/font>&nbsp;<\/p>\n<\/p>\n<p class=\"MsoNormal\">\n<p>&nbsp;<\/p>\n<\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">That&rsquo;s pretty much it.<span>&nbsp; <\/span>The code to make the first (i.e., 0<sup>th<\/sup>) LED blink would be something like:<\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><span>Dim <\/span><span>NumLeds <span>As New <\/span>NLED_COUNT_INFO<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>If <\/span><span>NLedGetDeviceInfo(NLED_COUNT_INFO_ID, NumLeds) = <span>True Then<\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&#8216;<\/span><span> <span>There&rsquo;s at least one LED<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>Dim <\/span><span>SettingsInfo <span>As New <\/span>NLED_SETTINGS_INFO<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>SettingsInfo.LedNum = 0<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>SettingsInfo.OffOnBlink = 2<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>If <\/span><span>NLedSetDevice(NLED_SETTINGS_INFO_ID, SettingsInfo) &lt;&gt; <span>True Then<\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&#8216; Deal with error condition somehow&hellip;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>End If<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Else<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&#8216; Deal with error condition somehow<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>End If<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><font face=\"Calibri\">Or you could similarly make clever helper functions like in the web page; i.e.:<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>Public<\/span> <span>Function<\/span> GetLedCount() <span>As<\/span> <span>Integer<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Dim<\/span> NumLeds <span>As<\/span> <span>New<\/span> NLED_COUNT_INFO<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>If<\/span> NLedGetDeviceInfo(NLED_COUNT_INFO_ID, NumLeds) = <span>True<\/span> <span>Then<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Return<\/span> <span>CInt<\/span>(NumLeds.cLeds)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>End<\/span> <span>If<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Return<\/span> 0<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>End<\/span> <span>Function<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>Public<\/span> <span>Sub<\/span> SetLedStatus(<span>ByVal<\/span> wLed <span>As<\/span> <span>Integer<\/span>, <span>ByVal<\/span> wStatus <span>As<\/span> <span>Integer<\/span>)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>Dim<\/span> SettingsInfo <span>As<\/span> <span>New<\/span> NLED_SETTINGS_INFO<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SettingsInfo.LedNum = <span>CUInt<\/span>(wLed)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SettingsInfo.OffOnBlink = wStatus<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLedSetDevice(NLED_SETTINGS_INFO_ID, SettingsInfo)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>End<\/span> <span>Sub<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">That&rsquo;s it!<span>&nbsp; <\/span>I have no idea what magic trick David will be using this for &ndash; but hey, with VB behind it, it&rsquo;s gotta work.<\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<h2><font size=\"4\"><font color=\"#4f81bd\"><font face=\"Cambria\">We&rsquo;ll meet again&hellip;<\/p>\n<p><\/font><\/font><\/font><\/h2>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">And now, time for a bit of an announcement, I suppose.<span>&nbsp; <\/span>For the past couple of years or so, after my stint as Dev Manager of Visual Basic, I&rsquo;ve been directing the traffic in Visual Studio, making sure that the code all got integrated correctly together and that our builds were solid.<span>&nbsp; <\/span>It&rsquo;s been just amazingly fun (and hectic!), but now my role has changed &ndash; as of two weeks ago, I&rsquo;m now the Development Manager of my division&rsquo;s engineering systems, which means that I&rsquo;ve acquired four additional teams under me, focused on improving the tools that both you and my division use.<\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">Unfortunately, that means that my opportunity to write entries for this blog has diminished significantly, as my work load is now quite large (though exciting!).<span>&nbsp; <\/span>I will certainly try to be a &ldquo;guest author&rdquo; when I can in the future, and I will continue to follow up on questions posed against my previous blog posts, but for now, I&rsquo;m going to have to take a hiatus on new blog work.<span>&nbsp; <\/span><\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">However, VB has the <b>best<\/b> customers, and such a solid language to work with, that I know it&rsquo;s going to be hard for me to stay away!<\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&lsquo;Til we meet again&hellip;<\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&#8211;Matt&#8211;*<\/p>\n<p><\/font><\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>One of the really fun things about being associated with the Visual Basic team is getting to see all of the varied usages to which our customers put it.&nbsp; From enterprise software to games, our customer base covers a wide range.&nbsp; The most fun to see, however, are the hobby applications, because the writers of [&hellip;]<\/p>\n","protected":false},"author":258,"featured_media":8818,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[22,195],"tags":[101,127,140,165,166],"class_list":["post-913","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-matt-gertz","category-visual-basic","tag-matt-gertz","tag-pinvoke","tag-smart-devices","tag-vb2005","tag-vb2008"],"acf":[],"blog_post_summary":"<p>One of the really fun things about being associated with the Visual Basic team is getting to see all of the varied usages to which our customers put it.&nbsp; From enterprise software to games, our customer base covers a wide range.&nbsp; The most fun to see, however, are the hobby applications, because the writers of [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/913","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/users\/258"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/comments?post=913"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/913\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media\/8818"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media?parent=913"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/categories?post=913"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/tags?post=913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}