<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>when setup isn't just xcopy</title><link>http://blogs.msdn.com/b/robmen/</link><description>Rob Mensching on Software Installation and Open Source at Microsoft.</description><dc:language>en-US</dc:language><generator>Telligent Community 5.6.583.21163 (Build: 5.6.583.21163)</generator><item><title>Goodbye, MSDN. I'm moving to http://RobMensching.com/blog.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/12/05/goodbye-msdn-i-m-moving-to-http-robmensching-com-blog.aspx</link><pubDate>Tue, 05 Dec 2006 10:12:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1209716</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I started&amp;nbsp;blogging three years ago when the &lt;a href="http://blogs.msdn.com/robmen/"&gt;MSDN blog&lt;/a&gt; site was still hosted on &lt;a href="http://blogs.gotdotnet.com/robmen/"&gt;gotdotnet&lt;/a&gt;.&amp;nbsp; Back then there were fifty or so Microsoft bloggers and people giggled when you said the word "blog".&amp;nbsp; Now there are so many Microsoft blogs that nobody bothers to keep count any more.  &lt;p&gt;I toyed with the idea with hosting my own private blog a while ago but got real serious about it when I finally picked up the vanity domain &lt;a href="http://RobMensching.com"&gt;http://RobMensching.com&lt;/a&gt;.&amp;nbsp; I was keeping tabs on the &lt;a href="http://subtextproject.com/"&gt;Subtext project&lt;/a&gt; because of my work on the &lt;a href="http://blogs.msdn.com/robmen/archive/2005/10/15/481451.aspx"&gt;Internal blogs at Microsoft&lt;/a&gt;&amp;nbsp;but when &lt;a href="http://haacked.com/archive/2006/08/31/Subtext_1.9_quotDaedelusquot_Released.aspx"&gt;Subtext finally supported medium trust&lt;/a&gt; I figured it was ready to host my own blog.&amp;nbsp; Finally, in November I pushed the huge reset button on life by &lt;a href="http://blogs.msdn.com/robmen/archive/2006/10/26/joining-marketplace.aspx"&gt;changing jobs&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/robmen/archive/2006/11/04/it-all-begins-in-november.aspx"&gt;getting married&lt;/a&gt; all at the same time.&amp;nbsp; I figured I might as well reset my presence in the &lt;a href="http://en.wikipedia.org/wiki/Blogosphere"&gt;blogosphere&lt;/a&gt;.  &lt;p&gt;You will now find my blog at &lt;a href="http://RobMensching.com/blog"&gt;http://RobMensching.com/blog&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I have not decided what I'm going to do with this blog.&amp;nbsp;&amp;nbsp;&amp;nbsp;Jascha and Didi have also been encouraging me to start posting on the &lt;a href="http://blogs.msdn.com/windowsmarketplace"&gt;Windows Marketplace blog&lt;/a&gt;.&amp;nbsp; Maybe I'll cross-post&amp;nbsp;Marketplace topics from my new blog to there.&amp;nbsp; Honestly, though I think we first need to move the Windows Marketplace blog off MSDN and onto &lt;a href="http://www.windowsmarketplace.com/"&gt;Windows Marketplace&lt;/a&gt; itself.&amp;nbsp; Maybe we could put it up at &lt;a href="http://www.windowsmarketplace.com/blog"&gt;http://www.windowsmarketplace.com/blog&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Cross-posting there makes me consider cross-posting setup topics from my new blog to here, making this blog purely about setup things.&amp;nbsp; Along those lines I've brought back the MSDN skin and the old blog title "when setup isn't just xcopy".&amp;nbsp; However, don't be surprised if this blog just halts like &lt;a href="http://blogs.msdn.com/dareObasanjo/"&gt;Dare's MSDN blog&lt;/a&gt;&amp;nbsp;and &lt;a href="http://blogs.msdn.com/alexbarn/"&gt;Alex's MSDN blog&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Anyway, "Goodbye, MSDN!"&amp;nbsp; It's been a fun few years but I'm moving out on my own.&amp;nbsp; Please come visit me at my new home at &lt;a href="http://RobMensching.com/blog"&gt;http://RobMensching.com/blog&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1209716" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item><item><title>It all begins in November...</title><link>http://blogs.msdn.com/b/robmen/archive/2006/11/04/it-all-begins-in-november.aspx</link><pubDate>Sat, 04 Nov 2006 18:12:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:958207</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>22</slash:comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/robmen/archive/2006/09/13/751867.aspx"&gt;As&lt;/a&gt; &lt;a href="http://blogs.msdn.com/robmen/archive/2006/09/15/757306.aspx"&gt;noted&lt;/a&gt; &lt;a href="http://blogs.msdn.com/robmen/archive/2006/10/26/joining-marketplace.aspx"&gt;previously&lt;/a&gt;, there are some major changes going on in my life right now.&amp;nbsp; This is the third and final change.&lt;/p&gt; &lt;p&gt;There are a few people out there that read my blog to hear my thoughts on &lt;a href="http://blogs.msdn.com/robmen/archive/tags/setup/default.aspx"&gt;software installation topics&lt;/a&gt;.&amp;nbsp; There are others who read my blog looking for tidbits of information about how &lt;a href="http://blogs.msdn.com/robmen/archive/tags/oss_4000_msft/default.aspx"&gt;Open Source works at Microsoft&lt;/a&gt;.&amp;nbsp; There is a third group of people that read my blog to see if their name shows up in text anywhere.&amp;nbsp; This blog entry is all about one person in that third group, Jennifer Marshall.&lt;/p&gt; &lt;p&gt;A little more than three years ago, I met Jenny at the &lt;a href="http://www.centuryballroom.com/"&gt;Century Ballroom&lt;/a&gt;.&amp;nbsp; I arrived early for the open dance that night and was waiting for the &lt;a href="http://www.centuryballroom.com/html/classes.php?class_type_id=3"&gt;Swing class&lt;/a&gt; to finish up.&amp;nbsp; For those of you that have you've never been out social dancing, let me paint you a picture.&lt;/p&gt; &lt;p&gt;Imagine a gigantic square hard wood floor with a two story open air above it.&amp;nbsp; Imagine&amp;nbsp;a stage up front and white covered tables around the other three edges of the dance floor.&amp;nbsp; Now, imagine two rings of about sixty people dancing.&amp;nbsp; On the outside ring, the leads (usually men, but this is Capitol Hill so you never can be sure &amp;lt;smile/&amp;gt;) face in and on the inside ring of people the follows (usually women) face out.&amp;nbsp; The instructors (one lead, one follow) are in the middle providing, er, instruction.&amp;nbsp; Finally, imagine the instructors calling out "Switch" every couple minutes and having the inner ring of follows move one lead to the left so everyone dances with everyone else.&lt;/p&gt; &lt;p&gt;I was sitting on the window sill across from the stage watching the beginner dance class.&amp;nbsp; I had been taking classes for a month or so by then and was able to tell which follows we following well.&amp;nbsp; One follow in particular caught my eye.&lt;/p&gt; &lt;p&gt;She was all the way across the dance floor.&amp;nbsp; I wish I could say it was her dancing that caught my eye but, honestly,&amp;nbsp;I don't remember.&amp;nbsp; I do remember seeing her long hair, fitted button-up shirt and sleek black slacks.&amp;nbsp; But what caught my eye was how she moved from one lead to lead with confidence.&amp;nbsp; When class ended shortly after she caught my eye, I watched her practically glide off the dance floor.&lt;/p&gt; &lt;p&gt;Jenny loves to tell this part of the story but you'll have to do with my rendition for now.&amp;nbsp; I hopped up off the window sill and slid up in front of her.&amp;nbsp; By this point, Jenny will tell you I was smiling from ear to ear but all I remember was saying, "Hi, I'm Rob.&amp;nbsp; Are you staying for the dance tonight?"&lt;/p&gt; &lt;p&gt;Jenny didn't stay that night, she had a test to go study for.&amp;nbsp; However, the following week as the introduction to Swing dancing circle went around before open dance and she showed up before me.&amp;nbsp; I said, "Hi, Jenny." she said, "Hi, Rob." and we have been dancing together since then.&lt;/p&gt; &lt;p&gt;Today Jenny and I are making together forever official.&amp;nbsp; November 4th, 2006 at the &lt;a href="http://www.edgewaterhotel.com/default.aspx?pageid=weddings"&gt;Edgewater hotel&lt;/a&gt; Jenny and I will be married.&lt;/p&gt; &lt;p&gt;Everyone should be so lucky to&amp;nbsp;have someone&amp;nbsp;as caring, generous, happy, outgoing, and beautiful as Jenny in their life.&amp;nbsp;&amp;nbsp;We have been through quite a few adventures in the last three years and I really look forward to what the next many, many years will bring us.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/robmen/archive/2006/10/26/joining-marketplace.aspx"&gt;I said before&lt;/a&gt;, "It all begins in November."&amp;nbsp; For Jenny and I life really does.&amp;nbsp; For the rest of you, Jenny and I are taking a couple weeks off to go enjoy Kauai and Maui.&amp;nbsp; We'll be back in time for Thanksgiving and I'll get back to writing sometime around then.&lt;/p&gt; &lt;p&gt;Until then, keep coding.&amp;nbsp; I'll be&amp;nbsp;on the beach drinking drinks with little umbrellas in them with my new wife.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=958207" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item><item><title>Joining Marketplace.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/10/26/joining-marketplace.aspx</link><pubDate>Fri, 27 Oct 2006 07:41:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:878127</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>10</slash:comments><description>&lt;a href="http://g.msn.com/WMHFUSEN/102171"&gt;&lt;img style="float: right; width: 120px; height: 240px" alt="Click here to visit Windows Marketplace" src="http://g.msn.com/WMHFUSEN/102188"&gt;&lt;/a&gt;  &lt;p&gt;As &lt;a href="http://blogs.msdn.com/robmen/archive/2006/09/13/751867.aspx"&gt;noted previously&lt;/a&gt;, there are some major changes going on in my life right now.&amp;nbsp; &lt;a href="http://blogs.msdn.com/robmen/archive/2006/09/15/757306.aspx"&gt;Derek leaving Microsoft&lt;/a&gt; and the affect that would have on the &lt;a href="http://wix.sourceforge.net/"&gt;WiX toolset&lt;/a&gt; was the first one I made public.&amp;nbsp; This is the second.&lt;/p&gt; &lt;p&gt;It was &lt;a href="http://blogs.msdn.com/robmen/archive/2004/10/15/242655.aspx"&gt;two years ago this month&lt;/a&gt; that I moved from the &lt;a href="http://www.microsoft.com/windowsserversystem/dsi/sdm.mspx"&gt;System Definition Model team&lt;/a&gt; to the Windows Core Operating System Division (COSD).&amp;nbsp; It has been a challenging ride but we did manage to build the new servicing infrastructure for Windows Vista.&amp;nbsp; I learned a lot about the setup for the Windows operating system and refined some of my debugging skills.&amp;nbsp; I also learned that I want to be more connected to customers than my role in COSD allowed.&lt;/p&gt; &lt;p&gt;So, it is time to leave.&amp;nbsp; I've operated in the depths of the operating system for long enough.&amp;nbsp;&amp;nbsp;I want to get back to improving the lives of customers directly.&amp;nbsp; I want to work on something that helps ISVs ship better software to customers faster.&amp;nbsp; I want to work on a small team with huge charter.&lt;/p&gt; &lt;p&gt;In a funny turn of events,&amp;nbsp;as I was planning to walk out of Microsoft, &lt;a href="http://stephesblog.blogs.com/"&gt;Stephen Walli&lt;/a&gt;&amp;nbsp;introduced me to my future boss.&amp;nbsp; At the end of November, I will be joining the &lt;a href="http://www.windowsmarketplace.com/"&gt;Windows Marketplace&lt;/a&gt; development team.&amp;nbsp; Once there I will be focusing on the &lt;a href="http://www.windowsmarketplace.com/content.aspx?ctId=302"&gt;digital locker&lt;/a&gt; and the "software distribution" side of &lt;a href="http://en.wikipedia.org/wiki/Electronic_Software_Distribution"&gt;Electronic Software Distribution (ESD)&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Never before have I been so excited to get started on a new project.&amp;nbsp; There are so many features in Windows Marketplace to enhance, improve and outright create that I'm sometimes not sure where I want to start.&amp;nbsp; But best of all there is no speed limit.&amp;nbsp; We have all been encouraged to go as fast as we can.&lt;/p&gt; &lt;p&gt;It all begins November.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=878127" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item><item><title>Orca is to hex editor as WiX is to ...?</title><link>http://blogs.msdn.com/b/robmen/archive/2006/10/23/orca-is-to-hex-editor-as-wix-is-to.aspx</link><pubDate>Mon, 23 Oct 2006 18:00:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:845453</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>11</slash:comments><description>&lt;p&gt;Jonathan Perret made the &lt;a href="http://blogs.msdn.com/robmen/archive/2006/10/17/wix-v3-syntax-for-detecting-the-clr.aspx#844211"&gt;following interesting comment on a previous blog entry&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;...I find it worrisome that even when using such a powerful tool as WiX, one still has to memorize such oddities. I mean, if my app has a prereq it sounds obvious I don't want to require it to uninstall the app. Why can't WiX implement this for me ?&lt;/p&gt; &lt;p&gt;Do you think it is a fair analogy to say that if Orca is like an hex editor then WiX would be MASM ? I.e. powerful for experts but every bit as dangerous ?&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I'm going to address those in the opposite order.&amp;nbsp; First, I often introduce the &lt;a href="http://wix.sourceforge.net/"&gt;WiX toolset&lt;/a&gt; as the C/C++ compiler/linker for MSI files.&amp;nbsp; With C/C++ you can leak memory, deference NULL and all kinds of other things that the programmer probably didn't intend.&amp;nbsp; The WiX toolset will similarly allow developers to do things that might not be what they actually intended.  &lt;p&gt;I think comparing the WiX toolset to MASM is cutting a bit too deep.&amp;nbsp; There are many things the WiX toolset handles that the developer never has to worry about.&amp;nbsp; Always lining up primary/foreign key references in the MSI database is an obvious one but there many others like the handling of the NULL property ([~]) in MULTI_SZ registry keys and the NT service groups and enabling distributed setup development through Fragments and linking.  &lt;p&gt;So why doesn't the WiX toolset just handle everything for the developer?&amp;nbsp; The answer is quite simple: "Because a developer might actually need to do what you wanted protection from."&amp;nbsp;  &lt;p&gt;In this particular case, I &lt;a href="http://blogs.msdn.com/robmen/archive/2006/08/22/712812.aspx"&gt;provided guidance&lt;/a&gt; that the Installed property should always be OR'd into your LaunchConditions.&amp;nbsp;&amp;nbsp;Doing so ensures that you can uninstall the application even if the condition is wrong.&amp;nbsp; The WiX toolset could &lt;em&gt;probably&lt;/em&gt; always automagically add "Installed OR" to LaunchConditions to make sure that this guidance is followed.  &lt;p&gt;But what if you as a developer actually need to block the uninstall of your application for some very specific reason?&amp;nbsp; If the WiX toolset always adds "Installed OR" to the LaunchCondition the developer is now fundamentally screwed by the very tools that were supposed to be helping.&amp;nbsp; Being a developer, I know that stupid tools trying to be smart are one of the fastest ways to infuriate a developer.  &lt;p&gt;Remember, one of the guiding principles of the WiX toolset is that if the Windows Installer supports the scenario then the WiX toolset does as well or it's a bug.  &lt;p&gt;So the question now is how do we&amp;nbsp;enable developers do what they need to do while helping them avoid known pitfalls?&amp;nbsp; I know of two methods, both of which are supported in the WiX toolset.  &lt;p&gt;1.&amp;nbsp; &lt;strong&gt;Static code analysis.&lt;/strong&gt;&amp;nbsp; Tools that understand the code and point out things that you probably did not intend are wickedly cool.&amp;nbsp; Visual Studio added static analysis features in VS2005.&amp;nbsp; The Windows Installer has actually had static analysis since the late 1990s.&amp;nbsp; It's called "validation" and msival2.exe and Orca both support it.&amp;nbsp; In WiX v3, light.exe now runs the same static code analysis after every build and there is a tool called smoke.exe that you can use to analyze MSI files without building.  &lt;p&gt;That said, today there is no rule that checks for the Installed property in LaunchConditions but it seems like a great thing to open as a &lt;a href="http://sourceforge.net/tracker/?group_id=105970&amp;amp;atid=642717"&gt;Feature Request&lt;/a&gt;, Jonathan.  &lt;p&gt;2.&amp;nbsp; &lt;strong&gt;Higher level languages.&lt;/strong&gt;&amp;nbsp; I am obviously biased but I don't believe you will find&amp;nbsp;a better low-level language for creating Windows Installer databases than WiX.&amp;nbsp; You can edit the .wxs files directly, use a GUI that converts the WiX elements into graphical concepts, or build another language that generates .wxs files and build your MSI files that way.&amp;nbsp; Higher level languages&amp;nbsp;can be more simplistic&amp;nbsp;because they target a specific need.  &lt;p&gt;For example, I haven't talked about &lt;a href="http://wix.sourceforge.net/clickthrough.html"&gt;ClickThrough&lt;/a&gt; much lately but if you look at the language required to describe an Isolated Application in ClickThrough, I think you'll agree it's much higher level.  &lt;p&gt;&amp;lt;IsolatedApp xmlns="&lt;a href="http://wix.sourceforge.net/schemas/clickthrough/isolatedapp/2006"&gt;http://wix.sourceforge.net/schemas/clickthrough/isolatedapp/2006"&lt;/a&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Package&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Feed&amp;gt;&lt;a href="http://localhost/ct/dc/DrizzleCast.feed"&gt;http://localhost/ct/dc/DrizzleCast.feed&lt;/a&gt;&amp;lt;/Feed&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;UpdateRate&amp;gt;1&amp;lt;/UpdateRate&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/Package&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Application&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;EntryPoint&amp;gt;DrizzleCast.exe&amp;lt;/EntryPoint&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;Source&amp;gt;C:\build\dc&amp;lt;/Source&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/Application&amp;gt;&lt;br&gt;&amp;lt;/IsolatedApp&amp;gt;  &lt;p&gt;For more information check out this &lt;a href="http://blogs.msdn.com/robmen/archive/2005/12/06/500737.aspx"&gt;blog entry about "domain specific languages"&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=845453" width="1" height="1"&gt;</description></item><item><title>WiX v3 syntax for detecting the CLR.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/10/17/wix-v3-syntax-for-detecting-the-clr.aspx</link><pubDate>Tue, 17 Oct 2006 20:54:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:835588</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/robmen/archive/2006/10/05/Thursday-Night-_2600_quot_3B00_Deployment-Dinner-Discussion_2600_quot_3B00_-with-Charlie-Poole_2E00_.aspx#822238"&gt;Duane Johnson asked how to use WiX v3 to detect the CLR&lt;/a&gt;.&amp;nbsp; Extensions in &lt;a href="http://wix.sourceforge.net/downloadv3.html"&gt;WiX v3&lt;/a&gt; are far more powerful than they were in &lt;a href="http://wix.sourceforge.net/downloadv2.html"&gt;WiX v2&lt;/a&gt;.&amp;nbsp; Unfortunately, to enable the new features a few things moved around.&amp;nbsp; &lt;/p&gt; &lt;p&gt;So, let's say you wanted to to ensure that the .NET Framework 2.0 is already installed.&amp;nbsp; All you have to do is add the following to your setup source code somewhere under the Product element:&lt;/p&gt;&lt;pre&gt;&amp;lt;PropertyRef Id="NETFRAMEWORK20"/&amp;gt;
&amp;lt;Condition Message="The .NET Framework 2.0 must be installed"&amp;gt;
&amp;nbsp;&amp;nbsp; Installed OR NETFRAMEWORK20
&amp;lt;/Condition&amp;gt;&lt;/pre&gt;
&lt;p&gt;To compile that snippet (and answer Duane's question) using the WiX v3 toolset, you'd do the following:&lt;/p&gt;&lt;pre&gt;candle -ext WixNetFxExtension my.wxs
light -ext WixNetFxExtension my.wixobj&lt;/pre&gt;
&lt;p&gt;That should create "my.msi" that will only install if you have the .NET Framework 2.0 already installed.&amp;nbsp; We continue to grow the list of Properties that the WiX toolset handles for you automatically.&amp;nbsp; For example, we already have searches for many of the Microsoft Office SKUs and Visual Studio as well.&amp;nbsp; We're also always looking for more built-in searches so if you have them and would like to contribute them to the community, send email to wix-devs @ lists.sourceforge.net.&lt;/p&gt;
&lt;p&gt;Finally, for the intrepid reader at home, do you know why I OR'd the "Installed" Property into the LaunchCondition example above?&amp;nbsp; When you think you know, check out &lt;a href="http://blogs.msdn.com/robmen/archive/2006/08/22/712812.aspx"&gt;this previous blog entry&lt;/a&gt;&amp;nbsp;for the answer.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=835588" width="1" height="1"&gt;</description></item><item><title>Deciphering the MSI Directory table, part 7 (directories are properties)</title><link>http://blogs.msdn.com/b/robmen/archive/2006/10/17/deciphering-the-msi-directory-table-part-7-directories-are-properties.aspx</link><pubDate>Tue, 17 Oct 2006 20:27:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:835433</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;In my last blog entry, I wrapped up saying that we'd talk about how to make your install directory configurable this time.&amp;nbsp; I'm sorry but I lied.&amp;nbsp; There is an important but confusing truth that you must understand before we continue.&amp;nbsp; Directories are Properties.&lt;/p&gt; &lt;p&gt;Some of you may have already caught on to this because the &lt;a href="http://windowssdk.msdn.microsoft.com/en-us/library/aa372057.aspx"&gt;MSI SDK documentation for what I call standard directories&lt;/a&gt; is labeled "System Folder Properties".&amp;nbsp; Also, if you at the &lt;a href="http://windowssdk.msdn.microsoft.com/en-us/library/aa370881.aspx"&gt;ProgramFilesFolder directory&lt;/a&gt; you'll see it's actually called the "ProgramFilesFolder Property".&amp;nbsp; I've avoided using the word "Property" to describe what we've known as "Directory identifier" until now to avoid confusion.&lt;/p&gt; &lt;p&gt;So what does it mean that Directories are really Properties?&lt;/p&gt; &lt;p&gt;Well, for one, it means that anywhere you can put a Property reference, you can put a Directory identifier instead.&amp;nbsp; When the Windows Installer resolves a Directory identifier as a Property it gets the full path for the directory.&amp;nbsp; For example you could put "[ProgramFilesFolder]" in the Value column of the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/registry_table.asp"&gt;Registry table&lt;/a&gt;&amp;nbsp;and get the full path to the Program Files directory in the registry key.&amp;nbsp;See the &lt;a href="http://windowssdk.msdn.microsoft.com/en-us/library/aa370881.aspx"&gt;Formatted topic in the MSI SDK&lt;/a&gt; for more information.&amp;nbsp; Also, remember from our &lt;a href="http://blogs.msdn.com/robmen/archive/2005/07/12/437912.aspx"&gt;previous examples&lt;/a&gt;, that all Windows Installer paths end with a backslash.&lt;/p&gt; &lt;p&gt;The fact that Directories are Properties also means that &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/custom_action_type_51.asp"&gt;Type 51 CustomActions&lt;/a&gt; can be used to change install locations.&amp;nbsp; But we'll talk more about that next time...&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=835433" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/setup/">setup</category></item><item><title>Deciphering the MSI Directory table, part 6 (standard directories)</title><link>http://blogs.msdn.com/b/robmen/archive/2006/10/12/deciphering-the-msi-directory-table-part-6-standard-directories.aspx</link><pubDate>Thu, 12 Oct 2006 18:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:819781</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>3</slash:comments><description>&lt;P&gt;Before picking up &lt;A href="http://blogs.msdn.com/robmen/archive/2005/11/04/489346.aspx" mce_href="http://blogs.msdn.com/robmen/archive/2005/11/04/489346.aspx"&gt;this&lt;/A&gt; &lt;A href="http://blogs.msdn.com/robmen/archive/2005/07/12/437912.aspx" mce_href="http://blogs.msdn.com/robmen/archive/2005/07/12/437912.aspx"&gt;series&lt;/A&gt; &lt;A href="http://blogs.msdn.com/robmen/archive/2005/07/04/435572.aspx" mce_href="http://blogs.msdn.com/robmen/archive/2005/07/04/435572.aspx"&gt;of&lt;/A&gt; &lt;A href="http://blogs.msdn.com/robmen/archive/2005/06/28/433241.aspx" mce_href="http://blogs.msdn.com/robmen/archive/2005/06/28/433241.aspx"&gt;blog&lt;/A&gt; &lt;A href="http://blogs.msdn.com/robmen/archive/2005/06/21/431294.aspx" mce_href="http://blogs.msdn.com/robmen/archive/2005/06/21/431294.aspx"&gt;entries&lt;/A&gt; on the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/directory_table.asp" mce_href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/directory_table.asp"&gt;Directory table&lt;/A&gt;&amp;nbsp;again, I went back and re-read all the previous entries to make sure I remembered the details told up to this point.&amp;nbsp; It was then that I realized the last entry on this series as posted over 11 months ago.&amp;nbsp; What disturbed me even more than the fact that I didn't realize I had dropped this series for so long (I thought I had posted in the last three months) was this quote:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;The first paragraph of &lt;A href="http://blogs.msdn.com/robmen/archive/2005/06/21/431294.aspx" mce_href="http://blogs.msdn.com/robmen/archive/2005/06/21/431294.aspx"&gt;part 1&lt;/A&gt; surprised me because it reminded me how long I've been operating under &lt;A href="http://blogs.msdn.com/robmen/archive/2005/10/15/481464.aspx" mce_href="http://blogs.msdn.com/robmen/archive/2005/10/15/481464.aspx"&gt;frustration&lt;/A&gt;.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;For some people this blog series will be deciphering the MSI Directory table.&amp;nbsp; For me this blog series will provide guide posts for a path I should never follow again.&amp;nbsp; But enough of that.&amp;nbsp; Let's get to the point and talk about standard directories in the Directory table.&lt;/P&gt;
&lt;P&gt;As always I'm going to start with some example data.&amp;nbsp; If this stuff doesn't look familiar (that's okay, it's been almost a year) I suggest going back and (re)reading &lt;A href="http://blogs.msdn.com/robmen/archive/2005/11/04/489346.aspx" mce_href="http://blogs.msdn.com/robmen/archive/2005/11/04/489346.aspx"&gt;part 5&lt;/A&gt;.&amp;nbsp; Here's a Directory table modified from our part 5.&lt;/P&gt;&lt;PRE&gt;Directory           Directory_Parent      DefaultDirs
s72                 S72                   l255
Directory           Directory
TARGETDIR                                 SourceDir
ProgramFilesFolder  TARGETDIR             PFiles
FirstFolder         ProgramFilesFolder    One
&lt;/PRE&gt;
&lt;P&gt;Based on what we've learned thus far, you should expect that Directory table to create the following layouts:&lt;/P&gt;&lt;PRE&gt;&lt;STRONG&gt;Target layout&lt;/STRONG&gt;
ProgramFilesFolder = TARGETDIR\PFiles\
FirstFolder        = TARGETDIR\PFiles\One\

&lt;STRONG&gt;Source layout
&lt;/STRONG&gt;ProgramFilesFolder = SourceDir\PFiles\
FirstFolder        = SourceDir\PFiles\One\
&lt;/PRE&gt;
&lt;P&gt;You'd be half correct.&amp;nbsp; The source layout would look exactly like that.&amp;nbsp; However, the target layout would be quite different.&amp;nbsp; The magic is in the &lt;A href="http://windowssdk.msdn.microsoft.com/en-us/library/aa370881.aspx" mce_href="http://windowssdk.msdn.microsoft.com/en-us/library/aa370881.aspx"&gt;ProgramFilesFolder identifier&lt;/A&gt;.&amp;nbsp; That's because ProgramFilesFolder is what I call a standard directory.&amp;nbsp; The MSI SDK has the &lt;A href="http://windowssdk.msdn.microsoft.com/en-us/library/aa372057.aspx" mce_href="http://windowssdk.msdn.microsoft.com/en-us/library/aa372057.aspx"&gt;full list of standard directories&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;So how does it work?&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Well, when the Windows Installer scans the Directory table, it converts the standard directory identifiers into the appropriate paths on the machine.&amp;nbsp; For example, ProgramFilesFolder turns into the value returned by &lt;A href="http://windowssdk.msdn.microsoft.com/en-us/library/ms647764.aspx" mce_href="http://windowssdk.msdn.microsoft.com/en-us/library/ms647764.aspx"&gt;::SHGetFolderPath()&lt;/A&gt; for &lt;A href="http://windowssdk.msdn.microsoft.com/en-us/library/ms649274.aspx" mce_href="http://windowssdk.msdn.microsoft.com/en-us/library/ms649274.aspx"&gt;CSIDL_PROGRAM_FILES&lt;/A&gt; which is usually something like "C:\Program Files\".&amp;nbsp; The &lt;A href="http://windowssdk.msdn.microsoft.com/en-us/library/aa369768.aspx" mce_href="http://windowssdk.msdn.microsoft.com/en-us/library/aa369768.aspx"&gt;LocalAppDataFolder&lt;/A&gt; identifier is the value returned for &lt;A href="http://windowssdk.msdn.microsoft.com/en-us/library/ms649274.aspx" mce_href="http://windowssdk.msdn.microsoft.com/en-us/library/ms649274.aspx"&gt;CSIDL_LOCAL_APPDATA&lt;/A&gt; which is usually something like "C:\Documents and Settings\&lt;I&gt;username&lt;/I&gt;\Local Settings\Application Data\".&lt;/P&gt;
&lt;P&gt;That means that our target layout actually looks something like this:&lt;/P&gt;&lt;PRE&gt;&lt;STRONG&gt;Target layout&lt;/STRONG&gt;
ProgramFilesFolder = ProgramFiles\
FirstFolder        = ProgramFiles\One\
&lt;/PRE&gt;
&lt;P&gt;&lt;EM&gt;Note: "ProgramFiles" is intended to represent wherever "C:\Program Files\" actually exists on the user's machine.&amp;nbsp; You should never expect ProgramFiles to be on the C: drive or even in "Program Files".&amp;nbsp; I say this because the "Program Files" string is localized, that'll getcha' for sure.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;This means that the FirstFolder directory will always be under ProgramFilesFolder.&amp;nbsp; Next time we'll see how to allow the user to configure where your application gets installed.&amp;nbsp; In the meantime, I&amp;nbsp;would encourage you to take a look at that &lt;A href="http://windowssdk.msdn.microsoft.com/en-us/library/aa372057.aspx" mce_href="http://windowssdk.msdn.microsoft.com/en-us/library/aa372057.aspx"&gt;list of standard directories&lt;/A&gt; the Windows Installer provides you.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=819781" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/setup/">setup</category></item><item><title>Conflicts of Interest?</title><link>http://blogs.msdn.com/b/robmen/archive/2006/10/10/conflicts-of-interest_3F00_.aspx</link><pubDate>Tue, 10 Oct 2006 18:55:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:813337</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;&lt;a href="http://roughtype.com"&gt;Nicholas Carr&lt;/a&gt; has a great &lt;a href="http://www.roughtype.com/archives/2006/10/a_glass_house.php"&gt;blog entry about conflicts of interest in blogging&lt;/a&gt;.&amp;nbsp; It got me thinking about&amp;nbsp;a silent policy I've always had for myself when blogging here.&amp;nbsp; I don't blog about the many vendors in the MSI creation space except the ones that I am affiliated with.&amp;nbsp; Namely I write about the &lt;a href="http://wix.sourceforge.net/"&gt;WiX toolset&lt;/a&gt;&amp;nbsp;(because I lead that effort)&amp;nbsp;and&amp;nbsp;sometimes VisualStudio's Setup Projects (because I work for Microsoft and I'm often asked to relate it to WiX ).&amp;nbsp; I don't write about &lt;a href="http://www.macrovision.com/products/flexnet_installshield/index.shtml"&gt;InstallShield&lt;/a&gt; or &lt;a href="http://www.wise.com/Products/Installations/WiseforWindowsInstaller.aspx"&gt;Wise&lt;/a&gt; or the many, many others.&lt;/p&gt; &lt;p&gt;My question to those of you who read my blog regularly is, "Do you think this policy is a good one and should I keep following it?"&amp;nbsp; Please, leave a comment below or send me a comment through the &lt;a href="http://blogs.msdn.com/robmen/contact.aspx"&gt;contact link&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=813337" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/context/">context</category><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item><item><title>Nothing.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/10/07/nothing_2E00_.aspx</link><pubDate>Sun, 08 Oct 2006 07:18:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:803237</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Thus far, today I have done absolutely nothing.&amp;nbsp; Sure, I cleaned off the kitchen table, put away some dishes and folded some clothes.&amp;nbsp; But I didn't really do anything.&amp;nbsp; I spent a few hours playing through a few demo disks DJ lent me for the new &lt;a href="http://www.xbox.com/en-US/hardware/xbox360"&gt;Xbox 360&lt;/a&gt;.&amp;nbsp; But that accomplished nothing. &amp;nbsp;Most recently I've been catching up on random blog entries posted by people I follow.&amp;nbsp; Like &lt;a href="http://www.25hoursaday.com/weblog/"&gt;Dare&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/oldnewthing/default.aspx"&gt;Raymond&lt;/a&gt; and&amp;nbsp;&lt;a href="http://blogs.msdn.com/astebner/default.aspx"&gt;Aaron&lt;/a&gt;. But nothing will come of that tonight.&lt;/p&gt; &lt;p&gt;What I've found&amp;nbsp;amazing is that it actually feels good.&amp;nbsp; Normally, I'd be itching to make at least some progress on at least one of the many projects that I'm currently juggling.&amp;nbsp; But today I really did nothing.&lt;/p&gt; &lt;p&gt;So, I hope one of you out there is coding tonight because right now I'm obviously not holding up my end of the deal.&amp;nbsp; I blame it on last night's &lt;a href="http://en.wikipedia.org/wiki/Irish_car_bomb"&gt;carbombs&lt;/a&gt;.&amp;nbsp; &amp;lt;smile/&amp;gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=803237" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item><item><title>Thursday Night "Deployment Dinner Discussion" with Charlie Poole.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/10/05/thursday-night-_2600_quot_3B00_deployment-dinner-discussion_2600_quot_3B00_-with-charlie-poole_2E00_.aspx</link><pubDate>Fri, 06 Oct 2006 09:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:795510</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;Tonight I traveled to &lt;A href="http://www.anthonys.com/restaurants/info/edmonds.html#2nd" mce_href="http://www.anthonys.com/restaurants/info/edmonds.html#2nd"&gt;Anthony's Beach Cafe&lt;/A&gt; in Edmonds, WA to have dinner with &lt;A href="http://www.charliepoole.org/" mce_href="http://www.charliepoole.org/"&gt;Charlie Poole&lt;/A&gt;.&amp;nbsp; Charlie is the active maintainer of the &lt;A href="http://www.nunit.org/" mce_href="http://www.nunit.org/"&gt;NUnit project&lt;/A&gt;.&amp;nbsp; He contacted me (via my blog, IIRC) and we set up tonight's meeting.&amp;nbsp; I expected he wanted to meet because &lt;A href="http://nunit.com/blogs/?p=39" mce_href="http://nunit.com/blogs/?p=39"&gt;NUnit is now using the WiX toolset too&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Charlie did want to talk a little about WiX but we&amp;nbsp;discussed a myriad of other topics as well for the two+ hours we were there.&amp;nbsp; In fact, we shut the place down.&amp;nbsp; Only the cooks were left cleaning when we walked out.&lt;/P&gt;
&lt;P&gt;The most interesting setup related topic was something Charlie thought I wouldn't be interested in.&amp;nbsp; NUnit is all managed code.&amp;nbsp; It supports all versions of the CLR as well as Mono.&amp;nbsp; Charlie told me he had written the detection logic for all the CLR versions and Mono.&amp;nbsp; I told him that the &lt;A href="http://wix.sourceforge.net/" mce_href="http://wix.sourceforge.net/"&gt;WiX toolset&lt;/A&gt; already had the detection logic for the CLR and he should just use that but I was very interested in getting the Mono detection logic into WiX.&lt;/P&gt;
&lt;P&gt;Charlie was surprised by both answers.&amp;nbsp; He asked how to use the CLR detection in WiX v2 now.&amp;nbsp; I didn't have the answer off the top of my head, but now that I'm home here's how you do it.&amp;nbsp; Add any (or all) of following to one of your .wxs files:&lt;/P&gt;&lt;PRE&gt;&amp;lt;PropertyRef Id="NETFRAMEWORK10"/&amp;gt;
&amp;lt;PropertyRef Id="NETFRAMEWORK11"/&amp;gt;
&amp;lt;PropertyRef Id="NETFRAMEWORK20"/&amp;gt;
&amp;lt;PropertyRef Id="NETFRAMEWORK30"/&amp;gt;&lt;/PRE&gt;
&lt;P&gt;Then you need to add the "netfx.wixlib" to your link line like so:&lt;/P&gt;&lt;PRE&gt;light my.wixobj netfx.wixlib -o my.msi&lt;/PRE&gt;
&lt;P&gt;That will add the appropriate detection logic to your MSI for the CLR using the WiX v2 toolset (WiX v3 command line syntax is a bit different).&amp;nbsp; Hopefully Charlie send back the Mono detection logic in a "mono.wixlib".&amp;nbsp; Over time, I hope WiX will have all these sorts of things done for you in many prebuilt .wixlibs.&lt;/P&gt;
&lt;P&gt;We also discussed Charlie's adventures in Europe learning and talking about Agile/XP methodologies, including what sounded like a fun trip with &lt;A href="http://c2.com/~ward/" mce_href="http://c2.com/~ward/"&gt;Ward Cunningham&lt;/A&gt;.&amp;nbsp; I also asked a number of questions about his consulting work.&lt;/P&gt;
&lt;P&gt;Another interesting topic we came upon was talking about our different Open Source projects.&amp;nbsp; Charlie mentioned he had communicated with &lt;A href="http://tirania.org/blog/" mce_href="http://tirania.org/blog/"&gt;Miguel de Icaza&lt;/A&gt;&amp;nbsp;when struggling with is project.&amp;nbsp; I think you can see a bit of that in his &lt;A href="http://nunit.com/blogs/?p=12" mce_href="http://nunit.com/blogs/?p=12"&gt;blog entry about the exaggerated death of NUnit&lt;/A&gt;.&amp;nbsp; We then discussed the relation of our Open Source projects with Microsoft.&amp;nbsp; Charlie asked why not make &lt;A href="http://blogs.msdn.com/robmen/archive/2006/09/18/761580.aspx" mce_href="http://blogs.msdn.com/robmen/archive/2006/09/18/761580.aspx"&gt;WiX the foundation of Visual Studio setup projects&lt;/A&gt;.&amp;nbsp; I told him I would love for that to work out.&amp;nbsp; Then I asked him about NUnit and VSTS.&amp;nbsp; Charlie pointed out that VSTS isn't structured properly to do true test driven development (TDD) but said he enjoyed the competition.&lt;/P&gt;
&lt;P&gt;All in all, it was a great dinner and I look forward to crossing paths with Charlie Poole in the future.&amp;nbsp; &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=795510" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category><category domain="http://blogs.msdn.com/b/robmen/archive/tags/wix/">wix</category></item><item><title>The Windows Live Writer team rocks.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/10/05/780445.aspx</link><pubDate>Thu, 05 Oct 2006 18:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:780445</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;I installed &lt;a href="http://windowslivewriter.spaces.live.com/"&gt;Windows Live Writer 1.0 Beta&lt;/a&gt; a while ago to test a project I was working on.&amp;nbsp; I didn't actually boot the application or anything, just installed it.&amp;nbsp; I think this proves how much of a setup geek I am.&amp;nbsp; &amp;lt;smile/&amp;gt;&lt;/p&gt; &lt;p&gt;Well, as you can see in my &lt;a href="http://blogs.msdn.com/robmen/archive/2006/09/30/778315.aspx"&gt;previous blog entry&lt;/a&gt;, I actually tried using Windows Live Writer.&amp;nbsp; I must say, in the short time I've used it, I'm impressed.&amp;nbsp; The UI is very intuitive.&amp;nbsp; The HTML generated is very clean.&amp;nbsp; The ability to preview the post using the styles from my blog is sweet.&amp;nbsp; I love the way that "Recent Posts" and "Drafts" are tracked seamlessly.&lt;/p&gt; &lt;p&gt;That said, I have had some small issues with cut and paste not doing exactly what I expected (whitespace just disappeared).&amp;nbsp; Window Live Writer also doesn't provide an easy way for me to add code snippets to blog entries (awesome if it was supported just like blockquote).&amp;nbsp; But I can edit the HTML directly to add PRE elements and Writer seems to handle that pretty well.&lt;/p&gt; &lt;p&gt;But this blog entry isn't supposed to be about Windows Live Writer &lt;em&gt;application&lt;/em&gt;.&amp;nbsp; Instead, I wanted to talk about the Windows Live Writer &lt;em&gt;team&lt;/em&gt;.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I met three of the developers on the Writer team a month or so ago: Bonnie, Joe and Spike.&amp;nbsp; We had a great discussion for almost two hours after work one Thursday.&amp;nbsp; One of the things I remember most is when we were discussing Beta feedback Joe commented sheepishly, "Probably the biggest mistake we made was not including the word 'blogging' in our dictionary.&amp;nbsp; Lots of people complained about that."&amp;nbsp; I chuckled when I posted my last blog entry because I did have to add "blogging" to the dictionary when the spell checker complained.&lt;/p&gt; &lt;p&gt;&amp;nbsp;But even more important than the interesting conversation I had with Bonnie, Joe, and Spike, I saw something I hadn't seen inside Microsoft for so long I had almost forgotten to look for it.&amp;nbsp; This team is &lt;em&gt;hungry&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;They aren't just building a simple blogging tool.&amp;nbsp; They are building a blogging tool that beginners can be comfortable with while meeting advanced users basic needs.&amp;nbsp; Then they released an &lt;a href="http://windowslivewriter.spaces.live.com/blog/cns!D85741BB5E0BE8AA!702.entry"&gt;update to their Beta&lt;/a&gt; based on user feedback.&amp;nbsp; Next they made their &lt;a href="http://dev.live.com/writer"&gt;application a platform&lt;/a&gt; and opened up an untold number of new uses.&amp;nbsp; And most importantly they didn't blink when it was suggested Windows Live Writer wasn't necessary because Word 2007 would support blogging too&amp;nbsp;(as &lt;a href="http://blogs.msdn.com/uac/archive/2005/12/20/Chris_Corio.aspx"&gt;Chris Corio&lt;/a&gt; might say, "The two apps are in completely different markets, yo!").&lt;/p&gt; &lt;p&gt;It wasn't until I was driving away that evening that the last piece of the puzzle clicked in my head.&amp;nbsp; Windows Live Writer was created by the same team that brought us &lt;a href="http://www.onfolio.com/"&gt;Onfolio&lt;/a&gt;.&amp;nbsp; This team of hungry developers was acquired from the "outside".&lt;/p&gt; &lt;p&gt;That realization eventually crystallized into something that I have been feeling for a year or more.&amp;nbsp; It feels like many developers at Microsoft are "playing to not lose".&amp;nbsp; What I saw in the Windows Live Writer team was a small group of developers "&lt;a href="http://www.amazon.com/Play-Win-Choosing-Growth-Over/dp/1885167318"&gt;playing to win&lt;/a&gt;".&amp;nbsp; I loved that.&amp;nbsp; It's past time for me to do the same.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=780445" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/context/">context</category><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item><item><title>SharpDevelop 2.1 - the latest WiX UI Editor</title><link>http://blogs.msdn.com/b/robmen/archive/2006/10/02/sharpdevelop-2.1-_2D00_-the-latest-wix-ui-editor.aspx</link><pubDate>Tue, 03 Oct 2006 09:32:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:784324</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I was cleaning out some old mail messages and came across this tidbit of information that several people sent me.&amp;nbsp; &lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/17/WixIntegration.aspx"&gt;SharpDevelop 2.1 now supports the WiX toolset&lt;/a&gt;.&amp;nbsp; At the same time, I noticed that &lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/04/NewWixInstallerForSharpDevelop21.aspx"&gt;SharpDevelop 2.1 moved to WiX&lt;/a&gt; to build its setup packages.&amp;nbsp; I took a quick scan through their MSI and it looks like a very well authored WiX v2 package.&amp;nbsp; They even use the standard UI and NGEN CustomActions provided by the WiX toolset.&amp;nbsp; Very nicely done.&lt;/p&gt; &lt;p&gt;SharpDevelop joins &lt;a href="http://wixedit.sourceforge.net/"&gt;WiXEDIT&lt;/a&gt; and &lt;a href="http://wixtool.org/"&gt;WiXTool&lt;/a&gt;&amp;nbsp;as another freely available UI for editing .wxs files.&amp;nbsp; I'll stick to &lt;a href="http://wix.sourceforge.net/votive.html"&gt;Votive&lt;/a&gt; (for Intelli-sense) and &lt;a href="http://www.flos-freeware.ch/notepad2.html"&gt;notepad2&lt;/a&gt; (for quick edits with syntax highlighting) but those of you looking for a UI might find one of those three tools interesting.&amp;nbsp; At least until we &lt;a href="http://blogs.msdn.com/robmen/archive/2006/09/18/761580.aspx"&gt;convince Visual Studio to support the WiX toolset&lt;/a&gt;.&amp;nbsp; &amp;lt;smile/&amp;gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=784324" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/wix/">wix</category></item><item><title>It isn't whether you win or lose, as long as you're growing.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/09/30/778315.aspx</link><pubDate>Sat, 30 Sep 2006 20:14:28 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:778315</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/rflaming"&gt;Robert&lt;/a&gt; sent me a couple quotes from &lt;a href="http://mlb.mlb.com/NASApp/mlb/team/player.jsp?player_id=400085"&gt;Ichiro&lt;/a&gt; in this morning’s &lt;a href="http://seattletimes.nwsource.com/html/home/index.html"&gt;Seattle Times&lt;/a&gt;. I thought they were quite appropriate to my “Here &amp;amp; Now” so I thought I’d just drop the quote in:  &lt;blockquote&gt; &lt;p&gt;"I think it's true for any player that they don't want to be on a losing team," Ichiro said Friday, speaking through a translator. "But even a winning team can't just win and not gain anything in the process.  &lt;p&gt;"So, the question is, whether you're a team that's winning or losing, are you gaining? Are you growing? And are you going forward with that?"&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;PS: This is also a test of &lt;a href="http://windowslivewriter.spaces.live.com/"&gt;Windows Live Writer&lt;/a&gt;'s blogging ability.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=778315" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item><item><title>Thursday Night "Deployment Dinner Discussions" with Carolyn Napier.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/09/21/765734.aspx</link><pubDate>Fri, 22 Sep 2006 06:10:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:765734</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Tonight Jenny and I hosted our second Thursday Night &amp;quot;&lt;a href="http://blogs.msdn.com/robmen/archive/2006/08/25/724999.aspx"&gt;Deployment Dinner Discussion&lt;/a&gt;&amp;quot;.  Our guests were Carolyn Napier and Steve Lesser.&lt;/p&gt;
&lt;p&gt;Actually, it isn't that simple.  You see, I have been meaning to invite Carolyn over for to see my house for about 3 years now (as long as I've lived here).  On top of that, Carolyn and Steve just got married so Carolyn's last name won't be Napier for much longer.  Although, she'll probably always be Carolyn Napier to me.&lt;/p&gt;
&lt;p&gt;You see, Carolyn and I were interns together on the Windows Installer team back in 1998.  Carolyn was there when I came back with the most heinous sunburn after a June snowboarding trip to Whistler.  Carolyn was there when &lt;a href="http://blogs.msdn.com/robmen/archive/2003/10/11/56487.aspx"&gt;Orca was created&lt;/a&gt;.  And, as she very much likes to remind me, Carolyn was there when I sent email to Bill Gates suggesting that more investment was needed software installation.&lt;/p&gt;
&lt;p&gt;Carolyn is now the lead of the Windows Installer team.  If you start counting from her first internship, she has probably been on the Windows Installer for a decade.  As you would expect, Carolyn is the absolute authority on &lt;b&gt;why &lt;/b&gt;the Windows Installer works the way it does.  When I get stuck, I go talk to Carolyn.&lt;/p&gt;
&lt;p&gt;Carolyn and I are also friends, so sometimes I just go talk to Carolyn.  Tonight we talked about today's Company Meeting (I'll share some thoughts later).  We talked about &lt;a href="http://blogs.msdn.com/robmen/archive/2006/09/15/757306.aspx"&gt;Derek's leaving Microsoft&lt;/a&gt;, Carolyn was his lead. We talked about the current events in the Microsoft flag football league.  We talked about Steve's and Carolyn's recent wedding and honeymoon.  We even talked about an ESPN sportscaster (I forget his name) who was praising the efforts of Occupational Therapy after his aneurism (Jenny enjoyed that part).  All of this over Jenny's super tasty burritos and, for dessert, pumpkin muffins.&lt;/p&gt;
&lt;p&gt;All in all, a very enjoyable evening.  I already have another Thursday Night &amp;quot;Deployment Dinner Discussion&amp;quot; lined up for October in Edmonds, WA.  As always, if you're visiting the Redmond/Seattle area and would like to sit down to talk setup, drop me a comment via my blog.&lt;/p&gt;
&lt;p&gt;Until then, keep coding. You know I am.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=765734" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category><category domain="http://blogs.msdn.com/b/robmen/archive/tags/setup/">setup</category></item><item><title>WiX in Visual Studio</title><link>http://blogs.msdn.com/b/robmen/archive/2006/09/18/761580.aspx</link><pubDate>Tue, 19 Sep 2006 05:40:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:761580</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>111</slash:comments><description>&lt;p&gt;In my &lt;a href="http://blogs.msdn.com/robmen/archive/2006/09/15/757306.aspx"&gt;previous blog entry&lt;/a&gt;, I mentioned that Visual Studio was adopting the &lt;a href="http://wix.sourceforge.net/"&gt;WiX toolset&lt;/a&gt;.  Despite the fact that Derek was leaving, that post generated a bit of &lt;a href="http://weblogs.asp.net/nunitaddin/archive/2006/09/16/WiX-v3-in-Visual-Studio_2100_.aspx"&gt;excitement&lt;/a&gt;.  I even had a couple people contact me directly about the prospect that Visual Studio would be shipping WiX v3.&lt;/p&gt;
&lt;p&gt;Unfortunately, when I said &amp;quot;the Visual Studio team approached the core WiX development team about replacing their custom MSI build system with the WiX toolset&amp;quot; I meant that Visual Studio would be using WiX to create the MSI file for Visual Studio.  As far as I know, there are currently no plans to replace the &amp;quot;Setup Projects&amp;quot; (.vdproj) in Orcas with the WiX toolset. If they are, Visual Studio certainly haven't told me about it.&lt;/p&gt;
&lt;p&gt;However, since a few people found the idea of replacing the .vdproj with WiX v3 so enticing, I'd like to do an informal poll.  Please, leave a comment below if you have an opinion on whether Visual Studio should replace the current &amp;quot;Setup Projects&amp;quot; (.vdproj) with WiX v3.  I'll be sure to point the guys I know on the Visual Studio team to the results.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=761580" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/wix/">wix</category></item><item><title>Bittersweet change, Derek Cicerone leaves WiX.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/09/15/757306.aspx</link><pubDate>Sat, 16 Sep 2006 08:13:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:757306</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;As I noted in my &lt;a href="http://blogs.msdn.com/robmen/archive/2006/09/13/751867.aspx"&gt;previous blog entry&lt;/a&gt;, there is a lot of change in my life right now.  Today &lt;a href="http://installing.blogspot.com/2006/09/retiring-from-wix-community.html"&gt;Derek Cicerone announced that he is retiring&lt;/a&gt; from the &lt;a href="http://wix.sourceforge.net/"&gt;WiX community&lt;/a&gt;.  What Derek left out is that today was also his last day at Microsoft after four years. He leaves this weekend for a startup in Silicon Valley.&lt;/p&gt;
&lt;p&gt;I've known about Derek's plans for about two weeks but it still hasn't sunk in yet.  You see, what most people don't realize is that Derek was instrumental in making the WiX toolset so successful.  WiX v2 core toolset would not be nearly as stable as it is now.  More importantly, WiX v3 would not exist without Derek's efforts.  For example, let's say there are about ten to fifteen major improvements in the v3 core toolset over v2.  I only wrote one of them.&lt;/p&gt;
&lt;p&gt;I want to tell the story of how Derek came to be so important to the WiX toolset but before I do there is one thing I want you to keep in mind.  Prior to his decision to leave, I actually considered passing on leadership of the WiX toolset to Derek.&lt;/p&gt;
&lt;p&gt;But let's go back to September, 2002.  I remember the first time I met Derek Cicerone.  I was in &lt;a href="http://blogs.msdn.com/rgustin"&gt;Reid Gustin's&lt;/a&gt; office and we were discussing some portion of Courier (the datacenter deployment system used by &lt;a href="http://office.microsoft.com/"&gt;Office Online&lt;/a&gt;).  The new hire that was to share the office with Reid (until Reid's internship ended and he went back to Stanford late September) showed up in the middle of our discussion.&lt;/p&gt;
&lt;p&gt;The new developer and his lead were discussing the project he was going to be working on.  Reid and I weren't trying to listen in but at some point the new hire asked, &amp;quot;So what is all this programmed in?&amp;quot; The lead responded, &amp;quot;Pretty much everything in Office is C/C++.&amp;quot;  The new hire said, &amp;quot;Oh, I don't like C++.&amp;quot;  There was a pause, while Reid and I looked at each trying not to snicker.  Finally, the lead asked, &amp;quot;So what language do you like?&amp;quot;  The new hire responded, &amp;quot;Oh, I like Java.&amp;quot;  I don't know if either Reid or I actually laughed out loud then but we both knew that the new developer was definitely not starting on the right foot. Derek Cicerone made quite the impression on his first day at Microsoft.&lt;/p&gt;
&lt;p&gt;It was about a year later that &lt;a href="http://scott.kurtzeborn.com/"&gt;Scott &amp;quot;K&amp;quot; Kurtzeborn&lt;/a&gt; called me up saying that Office was thinking seriously revamping their custom MSI build system.  K wanted me to talk to the person in charge of the design process because K thought WiX might be a good replacement.  I had just joined the SDM team at that time and was amused that I had to leave the Office team for Office to consider switching to the WiX toolset. You can imagine how much more amused I was when K showed up for lunch with none other than Derek Cicerone.&lt;/p&gt;
&lt;p&gt;Over the next year, Derek would come into his own.  First, he was instrumental in convincing his management in Office to take a risk on the newly rewritten WiX v2 code base.  Succeeding at that, Derek dove into the space, finding bugs, then helping fix bugs, then actively participating in new feature design and development to grow the WiX toolset to meet the needs of Office.  Finally, Derek became an active member of the community by answering questions and addressing bugs and feature requests.&lt;/p&gt;
&lt;p&gt;Back in the early days of 2004, Reid (who had joined the SDM team out of Stanford), Derek, K, &lt;a href="http://blogs.msdn.com/rflaming"&gt;Robert Flaming&lt;/a&gt; and I met at my house every Tuesday night to work on the WiX toolset.  We covered huge amounts of ground in those days.  It was so much fun.&lt;/p&gt;
&lt;p&gt;Derek became the champion for consistency in the code.  He went through numerous sweeps through the WiX v2 code base cleaning up blocks of code, trying to simplify everything, and fixing bugs he found along the way.  Derek also created the unit test infrastructure we use to test the WiX toolset.  Finally, Derek became a co-collaborator on new designs and features for the WiX toolset.&lt;/p&gt;
&lt;p&gt;The core WiX development team spent 2004 and most of 2005 simply fixing bugs in the WiX v2 code base, striving for stability in the core toolset.  In the summer of 2005, Derek wanted to start development on some of the ideas we had tossed around over the last couple years but didn't want to add to WiX v2 for fear of destabilizing the code base.  Finally, in October of 2005, we created WiX v3 and Derek simply took off.  A year later, I am amazed at how much nicer WiX v3 is to use and how very powerful the new features make it.&lt;/p&gt;
&lt;p&gt;Also in 2005, the Visual Studio team approached the core WiX development team about replacing their custom MSI build system with the WiX toolset.  Derek was at every meeting with me.  Together we answered their questions, discussed timelines and feature requests and ultimately convinced the Visual Studio team to bet on WiX v3 for their next release of Visual Studio.  Without Derek's experiences integrating WiX into Office, I'm not sure we could have convinced Visual Studio to pick up the WiX toolset.&lt;/p&gt;
&lt;p&gt;Then in 2006, Derek did even more of the work to get the SQL Server team moved to the WiX v3 toolset. Thanks to Derek's efforts, I expect by late 2007 the standard MSI creation technology at Microsoft will be the WiX v3 toolset.  So, I hope you can see now why I considered handing over leadership responsibility of the WiX toolset to Derek Cicerone.  He had certainly earned it, had he wanted it...&lt;/p&gt;
&lt;p&gt;However, Derek and I never actually had that conversation because Derek decided it was time for him to move on to very different problems than what Microsoft and the WiX toolset solved. After spending these last three years getting to know Derek, I'm certain this change is a great move for him.  In fact when he told me about the opportunity, I could only encourage him to go for it wholeheartedly.&lt;/p&gt;
&lt;p&gt;This is a bittersweet day for me.  The WiX community has lost a great contributor and leader in Derek. However, he has found something that aligns amazingly well with his interests.  I wish him the best of luck in it all and look forward to seeing him again November 4&lt;sup&gt;th&lt;/sup&gt;, 2006.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=757306" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category><category domain="http://blogs.msdn.com/b/robmen/archive/tags/wix/">wix</category></item><item><title>When it changes it pours.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/09/13/751867.aspx</link><pubDate>Wed, 13 Sep 2006 10:13:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:751867</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;The weather is starting to turn here in Redmond.  Fall is right around the corner.  With the change in seasons comes several significant and personal changes in my life. Preparing for those changes has actually impinged on my blogging lately.  Over the next few months, I'll be sharing each of these major changes here.&lt;/p&gt;
&lt;p&gt;While poised at this precipice of change for a short period of time, I've had some time to reflect on a question that struck me in the past.  &amp;quot;Why does it seem that changes get all bunched up together, instead of happening evenly over time?&amp;quot;&lt;/p&gt;
&lt;p&gt;Friends I've talked to have asked similar questions and we've shared hypothesis.  One idea that I cling to is that maybe we only remember or truly recognize the changes in our life when there are several stuck together to create a major event.  Another thought is that one change can break free a lot of other changes and all of these variously sized changes create a major event.&lt;/p&gt;
&lt;p&gt;In any case, I'll have more info at the end of the week.  In the meantime, keep coding.  You know I am.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=751867" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item><item><title>Thursday Night "Deployment Dinner Discussions" with Rob Mensching.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/08/25/724999.aspx</link><pubDate>Sat, 26 Aug 2006 05:30:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:724999</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Over the last couple months, I have been trying to come up with new ways to connect with the software installation community.  A couple weeks ago, I presented my first idea to Jenny.  The idea was to invite people over for dinner at our house to eat, sit, and talk.  Jenny agreed and last night we the first of what I hope is many Thursday night &amp;quot;Deployment Dinner Discussion&amp;quot;.&lt;/p&gt;
&lt;p&gt;Our first guest was &lt;a href="http://www.softricity.com/company/sschaefer.asp"&gt;Stuart Schaefer&lt;/a&gt; and his wife Ann (spelling?).  Stuart was CTO of &lt;a href="http://www.softricity.com/"&gt;Softricity&lt;/a&gt; and is now an architect at Microsoft, &lt;a href="http://www.microsoft.com/presspass/press/2006/jul06/07-17SoftricityPR.mspx"&gt;since Microsoft recently acquired Softricity&lt;/a&gt;. Stuart and Ann brought beer and dessert while I grilled the Korean Burgers and mixed up the salad.  It was a fun night of sharing histories with a bit of geek talk mixed in.  One of these days, I need to get around to sharing my thoughts on virtualization.&lt;/p&gt;
&lt;p&gt;I would like to extend the same invitation out to others in the software installation/deployment field. If you're visiting Redmond and have a Thursday evening open in your schedule, drop me a line.  It doesn't matter if you work for a big company or small company or just yourself.  If you find any of the content on my blog interesting or useful, we probably have something in common.  Just drop me a comment with your planned itinerary and we'll see if the timing works out with Jenny and my Thursday night schedules.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=724999" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category><category domain="http://blogs.msdn.com/b/robmen/archive/tags/setup/">setup</category></item><item><title>Creative Commons Add-in's Office XP PIA - Conditioning the Office XP PIAs - Part 1</title><link>http://blogs.msdn.com/b/robmen/archive/2006/08/22/712812.aspx</link><pubDate>Tue, 22 Aug 2006 16:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:712812</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>3</slash:comments><description>&lt;P&gt;&lt;A href="http://www.flickr.com/photos/86802561@N00/171850781/"&gt;&lt;IMG style="FLOAT: right" height=78 alt="Creative Commons Add-in for Microsoft Office" src="http://static.flickr.com/49/171850781_917fd33ebc_o.png" width=124&gt;&lt;/A&gt;Previously I described &lt;A href="http://blogs.msdn.com/robmen/archive/2006/07/27/681261.aspx"&gt;how the Office XP PIA install detected what parts of Office XP were installed&lt;/A&gt;. There are two places that the detection information is used and there are weaknesses in both places that we'll discuss. In this blog entry we'll take a look at the first place the detection logic is used.&lt;/P&gt;
&lt;P&gt;The condition we'll cover here is hopefully self explanatory, not that I'm content to just leave it with that. &amp;lt;smile/&amp;gt; Imagine a line of &lt;A href="http://wix.sourceforge.net/manual-wix2/wxs.htm"&gt;WiX code&lt;/A&gt; that is a child of the &lt;A href="http://wix.sourceforge.net/manual-wix2/wix_xsd_product.htm"&gt;Product element&lt;/A&gt; that looks much like this:&lt;/P&gt;&lt;PRE&gt;&amp;lt;Condition Message="Please install Microsoft Office XP before installing this product."&amp;gt;
ACTION~="ADVERTISE" OR ACTION~="ADMIN" OR OFFICE10INSTALLED OR REMOVE~="ALL"
&amp;lt;/Condition&amp;gt;
&lt;/PRE&gt;
&lt;P&gt;That &lt;A href="http://wix.sourceforge.net/manual-wix2/wix_xsd_condition.htm"&gt;Condition element&lt;/A&gt; turns into an entry in the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/launchcondition_table.asp?frame=true&amp;amp;hidetoc=true"&gt;LaunchCondition table&lt;/A&gt;. The easiest way to read the condition is to look at the content in the element and say, "If the ACTION Property is equal to ADVERTISE or ADMIN (ignoring case) or the Property OFFICE10INSTALLED is defined or REMOVE Property is equal to ALL (ignoring case) then let the install continue. Otherwise, display the message that says you have to install Office XP." &lt;/P&gt;
&lt;P&gt;Let's break the condition down once more.&lt;/P&gt;
&lt;P&gt;1. The &lt;A href="http://msdn.microsoft.com/library/en-us/msi/setup/action.asp"&gt;ACTION Property&lt;/A&gt; is a &lt;A href="http://msdn.microsoft.com/library/en-us/msi/setup/property_reference.asp"&gt;standard Windows Installer Property&lt;/A&gt;. It can only have three values and &lt;A href="http://msdn.microsoft.com/library/en-us/msi/setup/advertise_action.asp"&gt;ADVERTISE&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/library/en-us/msi/setup/admin_action.asp"&gt;ADMIN&lt;/A&gt; are described here. Fundamentally, this part of the condition says, "If we're doing an advertisement or an administrative install just pass on through."&lt;/P&gt;
&lt;P&gt;2. The OFFICE10INSTALLED Property is a custom Property that is set via a &lt;A href="http://wix.sourceforge.net/manual-wix2/wix_xsd_componentsearch.htm"&gt;ComponentSearch element&lt;/A&gt; for (what I'll call) the "Core Office Component" GUID. If the Core Office Component is installed the OFFICE10INSTALLED Property will contain the path to the &lt;A href="http://msdn.microsoft.com/library/en-us/msi/setup/component_table.asp"&gt;KeyPath&lt;/A&gt;. If the Core Office Component is not installed then OFFICE10INSTALLED will not defined and the condition will fail. Obviously, this is the key part of the condition.&lt;/P&gt;
&lt;P&gt;3. The &lt;A href="http://msdn.microsoft.com/library/en-us/msi/setup/remove.asp"&gt;REMOVE Property&lt;/A&gt; is another standard Windows Installer Property. I highly encourage you to read through the MSI SDK documentation about the REMOVE Property. Done? Good. In this case, the REMOVE Property is used to ensure that the condition will never prevent the user from uninstalling the Office XP PIA package. Imagine how frustrating the user would be if she first uninstalled her copy of Microsoft Office then tried to uninstall the Office XP package and found that she could not because the PIA package required Microsoft Office installed.&lt;/P&gt;
&lt;P&gt;Now that we understand the condition, let me show you the various weaknesses in this little bit of logic. None of these are fatal, but each of them could be improved.&lt;/P&gt;
&lt;P&gt;1. There isn't anything inherently wrong in allowing advertisements and administrative images to be created even though the other parts of the condition may later fail. However, in the Office XP PIA install there are two other conditions that basically make this part of our condition irrelevant. Curious what those conditions might be? Here's the WiX code for those two conditions:&lt;/P&gt;&lt;PRE&gt;&amp;lt;Condition Message="[ProductName] can not be installed with the ADVERTISE action."&amp;gt;
ACTION~&amp;amp;lt;&amp;amp;gt;"ADVERTISE"
&amp;lt;/Condition&amp;gt;
&amp;lt;Condition Message="Creating an admin install for [ProductName] is not supported."&amp;gt;
ACTION~&amp;amp;lt;&amp;amp;gt;"ADMIN"
&amp;lt;/Condition&amp;gt;
&lt;/PRE&gt;
&lt;P&gt;2. The weakness with the second part of the condition is a bit more subtle. The Office XP PIAs only provide value if you have Word, Excel, PowerPoint, Access, Outlook, FrontPage, Publisher, Visio, or OWC installed. However, it turns out that the "Core Office Component" ends up shipped in quite a few Microsoft products. That means that there are cases where the Office XP PIA install package can be installed even though you don't actually have any applications that could use the PIAs on your machine. As we'll see next time, there are no adverse affects of allowing the install through but it certainly isn't optimal.&lt;/P&gt;
&lt;P&gt;3. The final weakness actually demonstrates a change in what I used consider best practices and what I believe are "better practices" now. As noted in the scenario above, it was very important to add the REMOVE Property to the condition so the Office XP PIAs could always be uninstalled. In the past that seemed sufficient. However, now it seems better to use "Installed OR" in LaunchConditions. The &lt;A href="http://msdn.microsoft.com/library/en-us/msi/setup/installed.asp"&gt;Installed Property&lt;/A&gt; is standard Windows Installer Property like REMOVE but Installed is always set after the package is installed. Using "Installed OR" means that LaunchConditions will never block the user from repairing, patching, or uninstalling the package once it is installed.&lt;/P&gt;
&lt;P&gt;Next time we'll dig into how we condition the Office XP PIA install to only install the right PIAs.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=712812" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/setup/">setup</category><category domain="http://blogs.msdn.com/b/robmen/archive/tags/wix/">wix</category></item><item><title>This then this then this.  What am I still doing here?</title><link>http://blogs.msdn.com/b/robmen/archive/2006/08/09/693173.aspx</link><pubDate>Wed, 09 Aug 2006 11:50:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:693173</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>7</slash:comments><description>&lt;p&gt;First, I see &lt;a href="http://www.niallkennedy.com/blog/archives/2006/08/leaving-microsoft.html"&gt;this&lt;/a&gt;.  Then I'm skimming my RSS backlog and see &lt;a href="http://paul.kedrosky.com/archives/2006/08/04/time_to_quit.html"&gt;this&lt;/a&gt; that points at &lt;a href="http://sethgodin.typepad.com/seths_blog/2006/06/time_to_quit.html"&gt;this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This isn't the first time but it is the most recent occasion to pause me a moment and wonder, "What am I still doing here?"&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=693173" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item><item><title>Blogging from the outside.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/08/06/690493.aspx</link><pubDate>Mon, 07 Aug 2006 03:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:690493</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;&lt;A href="http://www.flickr.com/photos/86802561@N00/208695537/"&gt;&lt;IMG style="FLOAT: right" height="180" alt="Blogging outside." src="http://static.flickr.com/71/208695537_61d97e70eb_o.jpg" width="240"&gt;&lt;/A&gt;Jenny talked me into going shopping for patio furniture today. I was skeptical. There isn't a lot of space on our deck upstairs. I wasn't sure how well a table, four chairs and an umbrella would fit. That and I was thinking it would be more cost effective to go shopping at the end of the summer when stores were more likely to be unloading their outdoor furniture.&lt;/P&gt;
&lt;P&gt;It turns out that August pretty much is the end of the patio furniture season. There was very little selection and what was available was seriously marked down. Fortunately, Jenny and I found what we were looking for at Target for 30% off (my Mom would be so proud).&lt;/P&gt;
&lt;P&gt;Once home we enjoyed margaritas then hamburgers and most recently strawberry shortcake outside with our new patio furniture. Now I am just chilling out, writing this blog entry in between long glances towards the sun behind the trees. &lt;/P&gt;
&lt;P&gt;Sometimes I forget how nice it is to shift into neutral and just coast along for a while.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=690493" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item><item><title>Creative Commons Add-in's Office XP PIA - Detecting Office XP Parts</title><link>http://blogs.msdn.com/b/robmen/archive/2006/07/27/681261.aspx</link><pubDate>Fri, 28 Jul 2006 08:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:681261</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>2</slash:comments><description>&lt;P&gt;&lt;IMG style="FLOAT: left" height=78 alt="Creative Commons Add-in for Microsoft Office" src="http://static.flickr.com/49/171850781_917fd33ebc_o.png" width=124&gt;&lt;/A&gt;There was &lt;A href="http://blogs.msdn.com/robmen/archive/2006/07/12/664070.aspx#664210"&gt;a lot more interest&lt;/A&gt; in the Office XP PIA install that &lt;A href="http://blogs.msdn.com/robmen/archive/2006/07/12/664070.aspx"&gt;Bob created&lt;/A&gt; than I expected. I'm currently in the process of trying to get the Office team to take the work we did back and post that instead of the &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C41BD61E-3060-4F71-A6B4-01FEBA508E52"&gt;loose collection of files&lt;/A&gt; available today. I believe this is the most useful path for everyone involved. If that effort isn't successful then I guess I'll have to host the .wxs file to build the Office XP PIAs somewhere so everyone can build their own Office XP PIA installer (a far less enticing idea).&lt;/P&gt;
&lt;P&gt;In the meantime, let's talk about one of the tricky parts of the Office XP PIA install. While doing research into PIAs, and the Office PIAs in particular, I came across &lt;A href="http://blogs.msdn.com/artleo"&gt;Art Leonard&lt;/A&gt;'s post about &lt;A href="http://blogs.msdn.com/artleo/archive/2005/11/17/494137.aspx"&gt;PIA registration issues&lt;/A&gt;. I remembered Art from my days on the Office deployment team. He was doing work on the PIAs back before any of us even understood what they were for. I wish I knew what I know now back then. &amp;lt;smile/&amp;gt;&lt;/P&gt;
&lt;P&gt;Anyway, the gist of his blog entry (if you didn't read through it all) is that you should only install PIAs that match the installed Office applications. In other words, if you only have Word 2002 installed then only the Word PIAs should be installed. If you have Excel 2002 and Outlook 2002 installed then only the Excel and Outlook PIAs should be installed. &lt;/P&gt;
&lt;P&gt;Great, as if I wasn't perturbed about the whole missing Office XP PIA MSI install to being with. Now they had to go off and make it one step harder. Well, according to Art's blog post, what we're really need to be looking for is the TypeLibs that get installed for each application. Fine, I can do that with a &lt;A href="http://windowssdk.msdn.microsoft.com/en-us/library/ms708959.aspx"&gt;RegLocator table&lt;/A&gt; entry or a &lt;A href="http://wix.sourceforge.net/manual-wix2/wix_xsd_registrysearch.htm"&gt;RegistrySearch element&lt;/A&gt; in &lt;A href="http://wix.sourceforge.net/"&gt;WiX&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The WiX source code to search for the Excel 2002 TypeLib looks like this.&lt;/P&gt;&lt;PRE&gt;  &amp;lt;Property Id="EXCELTYPELIBREGISTERED10"&amp;gt;
    &amp;lt;RegistrySearch Id="FindExcelTypeLib10" Root="HKCR" 
                    Key="TypeLib\{00020813-0000-0000-C000-000000000046}\1.4" Type="raw" /&amp;gt;
  &amp;lt;/Property&amp;gt;
&lt;/PRE&gt;
&lt;P&gt;The Word 2002 TypeLib RegistrySearch looks like this:&lt;/P&gt;&lt;PRE&gt;  &amp;lt;Property Id="WORDTYPELIBREGISTERED10"&amp;gt;
    &amp;lt;RegistrySearch Id="FindWordTypeLib10" Root="HKCR" 
                    Key="TypeLib\{00020905-0000-0000-C000-000000000046}\8.2" Type="raw" /&amp;gt;
  &amp;lt;/Property&amp;gt;
&lt;/PRE&gt;
&lt;P&gt;How did I get those TypeLib Ids? I used &lt;A href="http://blogs.msdn.com/robmen/archive/2003/10/11/56487.aspx"&gt;Orca&lt;/A&gt; to peek into the Office XP MSI and cross referenced the data I found there with what was in the registry after install. Pretty easy, in the end.&lt;/P&gt;
&lt;P&gt;Next time I'll show what we do with the search results such that we follow Art's advice.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=681261" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/setup/">setup</category><category domain="http://blogs.msdn.com/b/robmen/archive/tags/wix/">wix</category></item><item><title>Wow, Microsoft Acquires Wininternals.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/07/18/669840.aspx</link><pubDate>Tue, 18 Jul 2006 16:46:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:669840</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>9</slash:comments><description>&lt;p&gt;&lt;a href="http://www.microsoft.com/presspass/default.mspx"&gt;PressPass&lt;/a&gt; just released the news that &lt;a href="http://www.microsoft.com/presspass/press/2006/jul06/07-18WinternalsPR.mspx"&gt;Microsoft has acquired Winternals&lt;/a&gt;.  This is amazing.  I've seen &lt;a href="http://www.sysinternals.com/Blog/"&gt;Mark Russinovich&lt;/a&gt; speak and he presented the data extremely eloquently.  However, what impressed me even more was the tools provided at &lt;a href="http://www.sysinternals.com/"&gt;Sysinternals&lt;/a&gt; were always really "tight".  I mean that in every sense of the word.  They were small, they were targeted, and they were flippin' cool.  Tight.&lt;/p&gt;
&lt;p&gt;May Mark and Bryce Cogswell (who I know nothing about) continue to stay "tight" inside the firewall.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=669840" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item><item><title>Creative Commons Add-in for Microsoft Office: Behind the Office PIAs.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/07/12/664070.aspx</link><pubDate>Thu, 13 Jul 2006 04:28:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:664070</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/86802561@N00/171850781/"&gt;&lt;img src="http://static.flickr.com/49/171850781_917fd33ebc_o.png" width="124" height="78" alt="Creative Commons Add-in for Microsoft Office" style="float:right"/&gt;&lt;/a&gt;Tonight, we'll continue with the story of the development of the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=113b53dd-1cc0-4fbe-9e1d-b91d07c76504"&gt;Creative Commons Add-in for Microsoft Office&lt;/a&gt;. As I &lt;a href="http://blogs.msdn.com/robmen/archive/2006/06/20/641202.aspx"&gt;mentioned in the introduction&lt;/a&gt; one of the first problems that we tackled was the Office PIAs.  Rather than provide you second hand information about the development of the PIA packages, I've invited &lt;a href="http://bobs.org/about.html"&gt;Bob Arnson&lt;/a&gt; to be a guest writer and tell you the story himself.  So, without further ado, I present the &amp;quot;Rolling Your Own Redist&amp;quot; by Bob Arnson.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;When a few members of the WiX team took on the side project of building the setup for the Creative Common Add-in, we had a set of requirements like most any software project. One of the requirements was that the add-in must support both Office XP and Office 2003.&lt;/p&gt;
&lt;p&gt;As &lt;a href="http://blogs.msdn.com/robmen/archive/2006/06/20/641202.aspx"&gt;Rob mentioned&lt;/a&gt;, to support both versions of Office meant dealing with both sets of primary interop assemblies (PIAs). For Office 2003, that's fairly straightforward. Though Office Setup doesn't install the PIAs by default, Microsoft provided the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=3c9a983a-ac14-4125-8ba0-d36d67e0f4ad"&gt;Office 2003 PIAs&lt;/a&gt; as a redistributable MSI package. &lt;/p&gt;
&lt;p&gt;For Office XP, the situation was a little less pleasant. The Office XP PIAs came as a set of DLLs, .reg files, and a batch file that calls Gacutil to install the assemblies into the .NET global assembly cache (GAC) and Regedit to write registry entries from the .reg files. Gacutil is a development tool, though it shipped in the .NET 1.1 Framework runtime. (In .NET 2.0, it's only in the SDK.) &lt;a href="http://msdn2.microsoft.com/en-us/library/ex0ss12c.aspx"&gt;The Gacutil documentation&lt;/a&gt; even warns against its use as an installation tool: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Be aware that using the /i and /u options alone does not support reference counting. These options are appropriate for use during product development but not for actual product installations. &lt;/p&gt;
&lt;p&gt;In fact, the batch file contains the following comment: &lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: This utility must be run from the Visual Studio .NET Command Prompt. It will not function properly otherwise. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And a batch file that calls Regedit? Well, you can read Rob's opinion on &lt;a href="http://blogs.msdn.com/robmen/archive/2004/05/20/136530.aspx"&gt;script custom actions&lt;/a&gt; and imagine how that might translate to using batch files during a real product setup. &lt;/p&gt;
&lt;p&gt;So I signed up to create a good setup package for the Office XP PIAs. The batch file told me what I needed to do -- install the assemblies into the GAC and write some registry entries. Windows Installer natively supports both actions. &lt;/p&gt;
&lt;p&gt;So one Tuesday night, instead of working on WiX, I put together a &amp;quot;first draft&amp;quot; of the Office XP PIA installer. Installing assemblies into the GAC is easy: Just add &lt;b&gt;Assembly=&amp;quot;.net&amp;quot;&lt;/b&gt; to the assembly's File element. For example: &lt;/p&gt;
&lt;pre&gt;
&amp;lt;File 
  Id=&amp;quot;MoiFrontPage.dll&amp;quot; 
 Name=&amp;quot;Microsoft.Office.Interop.FrontPage.dll&amp;quot; 
  KeyPath=&amp;quot;yes&amp;quot; 
  Assembly=&amp;quot;.net&amp;quot; 
  DiskId=&amp;quot;1&amp;quot; 
  Source=&amp;quot;Microsoft.Office.Interop.FrontPage.dll&amp;quot; /&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Converting the .reg files to WiX source code was also easy thanks to the WiX Tallow tool. I took the fragments Tallow created and pasted each one into the same component that held the assembly. &lt;/p&gt;
&lt;p&gt;A few tests later, I was confident we had a decent installer for the Office XP PIAs. The job wasn't quite done -- Rob later added ComponentSearch, RegistrySearch, and FileSearch elements to prevent the PIAs from being reinstalled if they're already present. But none of it required any secret information from inside the Microsoft firewall. Best of all, there are no custom actions or batch files.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=664070" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/setup/">setup</category><category domain="http://blogs.msdn.com/b/robmen/archive/tags/wix/">wix</category></item><item><title>7 lbs. of M&amp;Ms means only one thing.</title><link>http://blogs.msdn.com/b/robmen/archive/2006/06/28/649817.aspx</link><pubDate>Wed, 28 Jun 2006 16:48:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:649817</guid><dc:creator>Rob Mensching</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;If you follow Microsoft culture then you've undoubtedly heard about the distribution of M&amp;amp;Ms on employee anniversaries.  Specifically, it is tradition to put one pound of M&amp;amp;Ms for each year you've worked at Microsoft in a bowl outside your office.  Today there is a bowl with seven pounds of M&amp;amp;Ms outside my door.  If you're in the Redmond area, I encourage you to stop by my office and have some.  If you're off campus, drop me a note via the contact and I'll let the building receptionist know to expect you.&lt;/p&gt;
&lt;p&gt;Year 1 (June 1999 - June 2000): worked on Office deployment team (to ship Office XP)&lt;/p&gt;
&lt;p&gt;Year 2 (June 2000 - June 2001): worked on Office deployment team (shipped Office XP)&lt;/p&gt;
&lt;p&gt;Year 3 (June 2001 - June 2002): worked on Office deployment team (to ship Office 2003)&lt;/p&gt;
&lt;p&gt;Year 4 (June 2002 - June 2003): worked on Office deployment team (to ship Office 2003)&lt;/p&gt;
&lt;p&gt;Year 5 (June 2003 - June 2004): transitioned to System Definition Model team (shipped in VSTA)&lt;/p&gt;
&lt;p&gt;Year 6 (June 2004 - June 2005): transitioned to Windows deployment team (to ship Vista)&lt;/p&gt;
&lt;p&gt;Year 7 (June 2005 - June 2006): worked on Windows deployment team (to ship Vista)&lt;/p&gt;
&lt;p&gt;Year 1 - Year 7: worked on &lt;a href="http://wix.sourceforge.net/"&gt;Windows Installer XML toolset&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=649817" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/robmen/archive/tags/personal/">personal</category></item></channel></rss>
