<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Joy of Setup &#187; Windows Installer</title>
	<atom:link href="http://www.joyofsetup.com/category/msi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.joyofsetup.com</link>
	<description>Bob Arnson's blog about setup and servicing</description>
	<lastBuildDate>Tue, 29 Jun 2010 02:41:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Highlights of WiX v3.0.4917.0</title>
		<link>http://www.joyofsetup.com/2009/01/17/highlights-of-wix-v3049170/</link>
		<comments>http://www.joyofsetup.com/2009/01/17/highlights-of-wix-v3049170/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 02:29:19 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[WiX]]></category>
		<category><![CDATA[Windows Installer]]></category>
		<category><![CDATA[WiX highlights]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2009/01/17/highlights-of-wix-v3049170/</guid>
		<description><![CDATA[WiX v3.0.4917.0 was released on Saturday, 17-January-2009. You can download it from http://wix.sourceforge.net/releases/3.0.4917.0/. v3.0.4917.0 is the fourth post-beta build of WiX v3.0. There are 37 v3.0 bugs still open in the bug tracker. New features Rob and I added support for MSI 5.0. See the details here. Mike deprecated PerfCounter because PerformanceCounter is a superset. [...]]]></description>
			<content:encoded><![CDATA[<p>WiX v3.0.4917.0 was released on Saturday, 17-January-2009. You can download it from <a href="http://wix.sourceforge.net/releases/3.0.4917.0/">http://wix.sourceforge.net/releases/3.0.4917.0/</a>. </p>
<p>v3.0.4917.0 is the fourth post-beta build of WiX v3.0. There are <a href="https://sourceforge.net/tracker2/?limit=100&amp;func=&amp;group_id=105970&amp;atid=642714&amp;assignee=&amp;status=4&amp;category=&amp;artgroup=502142&amp;keyword=&amp;submitter=&amp;artifact_id=&amp;limitz=100&amp;assignee=&amp;status=1&amp;category=&amp;artgroup=502142&amp;submitter=&amp;keyword=&amp;artifact_id=&amp;submit=Filter&amp;limitz=100&amp;mass_category=&amp;mass_priority=&amp;mass_resolution=&amp;mass_assignee=&amp;mass_artgroup=&amp;mass_status=&amp;mass_cannedresponse=">37 v3.0 bugs still open</a> in the <a href="https://sourceforge.net/tracker2/?func=browse&amp;group_id=105970&amp;atid=642714">bug tracker</a>.</p>
<h2>New features</h2>
<ul>
<li><a href="http://robmensching.com/blog/">Rob</a> and <a href="http://www.joyofsetup.com/">I</a> added support for <a href="http://msdn.microsoft.com/en-us/library/dd408114(VS.85).aspx">MSI 5.0</a>. <a href="http://www.joyofsetup.com/2009/01/17/msi-v50-features-in-wix-v30/">See the details here.</a> </li>
<li>Mike deprecated PerfCounter because PerformanceCounter is a superset. </li>
</ul>
<h2>Bug fixes</h2>
<ul>
<li>Mike fixed a bug in the MSBuild targets that broke localized builds in some conditions. </li>
<li>Eric fixed setup.exe&#8217;s handling of patches. </li>
<li><a href="http://blogs.msdn.com/heaths/">Heath</a> fixed 2320416 [[<a href="https://sourceforge.net/tracker2/?func=detail&amp;aid=2320416&amp;group_id=105970&amp;atid=642714">BinaryRef is not pulling in the Binary table row</a>]]. </li>
<li>Mike fixed 2373777 [[<a href="https://sourceforge.net/tracker2/?func=detail&amp;aid=2373777&amp;group_id=105970&amp;atid=642714">IIS creating additional COM application on reinstall</a>]]. </li>
<li>Mike fixed 2392718 [[<a href="https://sourceforge.net/tracker2/?func=detail&amp;aid=2392718&amp;group_id=105970&amp;atid=642714">Error unistalling WebApplication's COM+ object.</a>]]. </li>
<li>Rob fixed 2497976 [[<a href="https://sourceforge.net/tracker2/?func=detail&amp;aid=2497976&amp;group_id=105970&amp;atid=642714">ServiceInstall sends wrong attribute to PermissionEx</a>]]. </li>
<li>I fixed 2504320 [[<a href="https://sourceforge.net/tracker2/?func=detail&amp;aid=2504320&amp;group_id=105970&amp;atid=642714">Wix build fails when WixToolPath set to a relative directory</a>]]. </li>
<li><a href="http://blogs.msdn.com/astebner/">Aaron</a> fixed 2504909 [[<a href="https://sourceforge.net/tracker2/?func=detail&amp;aid=2504909&amp;group_id=105970&amp;atid=642714">Heat.exe may generate invalid IDs</a>]]. </li>
<li>Rob fixed 2511376 [[<a href="https://sourceforge.net/tracker2/?func=detail&amp;aid=2511376&amp;group_id=105970&amp;atid=642714">heat.exe 3.0.4909.0 error HEAT0001 when harvesting directory</a>]]. </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2009/01/17/highlights-of-wix-v3049170/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MSI v5.0 features in WiX v3.0</title>
		<link>http://www.joyofsetup.com/2009/01/17/msi-v50-features-in-wix-v30/</link>
		<comments>http://www.joyofsetup.com/2009/01/17/msi-v50-features-in-wix-v30/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 02:27:56 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[WiX]]></category>
		<category><![CDATA[Windows Installer]]></category>
		<category><![CDATA[WiX highlights]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2009/01/17/msi-v50-features-in-wix-v30/</guid>
		<description><![CDATA[MSI 5.0 ships in the recently released Windows 7 beta. When the Windows 7 beta SDK was released, Rob and I had the detailed information we needed to add support for those features in WiX. A week and a day later, WiX v3.0.4917.0 includes that support. What&#8217;s new? In a long-awaited nod to modern UIs, [...]]]></description>
			<content:encoded><![CDATA[<p>MSI 5.0 ships in the recently released <a href="http://www.joyofsetup.com/2009/01/07/windows-7-server-2008-r2-betas-now-available-on-msdn/">Windows 7 beta</a>. When the <a href="http://www.joyofsetup.com/2009/01/13/windows-7-beta-sdk-now-available/">Windows 7 beta SDK was released</a>, Rob and I had the <a href="http://msdn.microsoft.com/en-us/library/dd408114(VS.85).aspx">detailed information</a> we needed to add support for those features in WiX. A week and a day later, <a href="http://www.joyofsetup.com/2009/01/17/highlights-of-wix-v3049170/">WiX v3.0.4917.0</a> includes that support.</p>
<h2>What&#8217;s new?</h2>
<ul>
<li>In a long-awaited nod to modern UIs, MSI 5.0 supports a <a href="http://msdn.microsoft.com/en-us/library/dd407936(VS.85).aspx">hyperlink control</a>. In WiX authoring, the hyperlink control using &quot;Hyperlink&quot; as the <a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_control.htm">Control/@Type attribute</a>:<br />
<blockquote>
<p>&lt;Control Id=&quot;MyHyperlinkControl1&quot; Height=&quot;20&quot; Width=&quot;100&quot; Type=&quot;Hyperlink&quot; X=&quot;5&quot; Y=&quot;5&quot;&gt;          <br />&#160; &lt;Text&gt;&lt;![CDATA[&lt;a href=&quot;<a href="http://www.joyofsetup.com/&quot;">http://www.joyofsetup.com/&quot;</a>&gt;Joy of Setup&lt;/a&gt;]]&gt;&lt;/Text&gt;           <br />&lt;/Control&gt;</p>
</blockquote>
</li>
<li>The <a href="http://msdn.microsoft.com/en-us/library/dd408010(VS.85).aspx">MsiPrint control event</a> supports printing a rich-edit control, much like the WixUI support for printing the license agreement. </li>
<li>The <a href="http://msdn.microsoft.com/en-us/library/dd408008(VS.85).aspx">MsiLaunchApp control event</a> launches an installed file, like the <a href="http://wix.sourceforge.net/manual-wix3/run_program_after_install.htm">WixShellExec custom action</a>. </li>
<li>The <a href="http://msdn.microsoft.com/en-us/library/dd408039(VS.85).aspx">MsiShortcutProperty table</a> supports adding properties to shortcuts. WiX exposes this functionality with ShortcutProperty elements as children of the <a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_shortcut.htm">Shortcut element</a>. </li>
<li>The <a href="http://msdn.microsoft.com/en-us/library/dd408009(VS.85).aspx">MsiLockPermissionsEx table</a> supports a richer set of security settings, like WixUtilExtension&#8217;s <a href="http://wix.sourceforge.net/manual-wix3/util_xsd_permissionex.htm">PermissionEx element</a> and custom actions. WiX supports MsiLockPermissionsEx with a PermissionEx element in the WiX (not WixUtilExtension) namespace. <a href="http://msdn.microsoft.com/en-us/library/dd408009(VS.85).aspx">MsiLockPermissionsEx </a>and the new PermissionEx element use <a href="http://msdn.microsoft.com/en-us/library/aa379567%28VS.85%29.aspx">security descriptor definition language</a> (SDDL) to describe permissions. Both also support conditionally applying permissions. See <a href="http://msdn.microsoft.com/en-us/library/dd408053(VS.85).aspx">Securing Resources</a> for details. </li>
<li>The <a href="http://msdn.microsoft.com/en-us/library/dd408038(VS.85).aspx">MsiServiceConfig</a> and <a href="http://msdn.microsoft.com/en-us/library/dd408037(VS.85).aspx">MsiServiceConfigFailureActions</a> tables add service-configuration options, like WixUtilExtension&#8217;s ServiceConfig element and custom actions. WiX supports the tables with a ServiceConfig element that, like the PermissionEx element, is in the WiX namespace. </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2009/01/17/msi-v50-features-in-wix-v30/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Windows 7 beta SDK now available</title>
		<link>http://www.joyofsetup.com/2009/01/13/windows-7-beta-sdk-now-available/</link>
		<comments>http://www.joyofsetup.com/2009/01/13/windows-7-beta-sdk-now-available/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 07:57:35 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[Windows Installer]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2009/01/13/windows-7-beta-sdk-now-available/</guid>
		<description><![CDATA[The Windows 7 beta SDK showed up on MSDN late Friday and is now available from the Microsoft download center for those without an MSDN subscription. Included in the new SDK is a new version of Orca and details about the new features in MSI 5.0. At the moment, the documentation doesn&#8217;t appear to be [...]]]></description>
			<content:encoded><![CDATA[<p>The Windows 7 beta SDK showed up on MSDN late Friday and is now <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=a91dc12a-fc94-4027-b67e-46bab7c5226c&amp;DisplayLang=en">available from the Microsoft download center</a> for those without an MSDN subscription. Included in the new SDK is a new version of Orca and details about the new features in MSI 5.0.</p>
<p>At the moment, the documentation doesn&#8217;t appear to be available in the <a href="http://msdn.microsoft.com/en-us/library/default.aspx">online MSDN Library</a>.</p>
<p>[via <a href="http://blogs.msdn.com/sandcastle/archive/2009/01/13/beta-release-of-microsoft-windows-sdk-for-windows-7-and-net-framework-3-5-sp1.aspx">Anand</a> and <a href="http://blogs.msdn.com/rflaming/archive/2009/01/12/beta-release-of-the-windows-sdk-for-windows-7-and-net-framework-3-5-sp1.aspx">Robert</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2009/01/13/windows-7-beta-sdk-now-available/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Paying for upgrades</title>
		<link>http://www.joyofsetup.com/2008/12/30/paying-for-upgrades/</link>
		<comments>http://www.joyofsetup.com/2008/12/30/paying-for-upgrades/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 09:18:35 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[Windows Installer]]></category>
		<category><![CDATA[best practices]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2008/12/30/paying-for-upgrades/</guid>
		<description><![CDATA[No, this isn&#8217;t a post on the costs of proprietary software but an amplification/clarification to my previous post. On wix-users, there&#8217;s a thread on the pains of automating upgrades. If your product consists of a large number of files and the file set changes regularly – files being added and removed during the product lifetime [...]]]></description>
			<content:encoded><![CDATA[<p>No, this isn&#8217;t a post on the costs of proprietary software but an amplification/clarification to my <a href="http://www.joyofsetup.com/2008/12/29/neither-more-nor-less/">previous post</a>. On <em>wix-users</em>, there&#8217;s a <a href="https://sourceforge.net/mailarchive/forum.php?thread_name=7A84109A2C011C47B536D8FDCA5E19B9E16B747C55%40mail.Wintellect.local&amp;forum_name=wix-users'">thread</a> on the pains of automating upgrades.</p>
<p>If your product consists of a large number of files and the file set changes regularly – files being added and removed during the product lifetime – it&#8217;s only natural to want to avoid the cost of hand-authoring setup changes to match. (A little over a year ago, I <a href="http://www.joyofsetup.com/2007/10/03/flight-simulator-x-acceleration-releases-to-manufacturing/">shipped a product with over 7000 files</a>, so I&#8217;m familiar with the pain and desire for automation.)</p>
<p>Unfortunately, our <a href="http://en.wikipedia.org/wiki/Frenemy">frenemy</a> the <a href="http://msdn.microsoft.com/en-us/library/aa372795.aspx">component</a> <a href="http://blogs.msdn.com/robmen/archive/2003/10/18/56497.aspx">rules</a> makes such automation difficult. The closest we-the-WiX-team has gotten to a complete solution is to create components with one file each, which makes the component eligible to have its component GUID <a href="http://installing.blogspot.com/2006/09/automatically-generating-component.html">automatically generated</a> (using an asterisk in the <a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_component.htm">Component element&#8217;s Guid attribute</a> value).</p>
<p>What doesn&#8217;t work is when files are removed. Windows Installer doesn&#8217;t let you remove components in a minor upgrade, so using one file per component doesn&#8217;t immediately solve the automation problem: Your automatically-generated minor upgrade will be missing a component, which is a <a href="http://blogs.msdn.com/heaths/archive/2006/01/23/516457.aspx">mortal component-rule sin</a>.</p>
<p>Nor can you avoid the problem by using multiple files per component because component rules say that components must be immutable: You can&#8217;t add or remove resources from a component.</p>
<p>So automating the creation of minor upgrades has additional costs:</p>
<ul>
<li>Additional tooling to try to support removing files without blatantly violating component rules.</li>
<li>Additional coding in your product to tolerate &#8220;obsolete&#8221; files without being able to remove them.</li>
</ul>
<p>For many types of apps, but especially Web apps with many content files, that&#8217;s a huge cost. Being able to ship minor-upgrade patches from an automated build might be a benefit worth the cost. It&#8217;s really a decision your team needs to make.</p>
<p>I&#8217;ll add that if you don&#8217;t anticipate shipping patches on a regular schedule, you might just automate the authoring of your RTM product and pay the price of manually tweaking your setup authoring when you need to ship a patch. Again, it&#8217;s a cost-benefit decision your team needs to think about.</p>
<h2>Cheap and easy</h2>
<p>If you don&#8217;t absolutely need to ship patches, you can avoid the costs of minor upgrades by simply using major upgrades. You can remove files without worrying about component-rule violations if you use an &#8220;early&#8221; scheduling of the <a href="http://msdn.microsoft.com/en-us/library/aa371197.aspx">RemoveExistingProducts</a> standard action – before or immediately after the <a href="http://msdn.microsoft.com/en-us/library/aa369535(VS.85).aspx">InstallInitialize action</a>.</p>
<p>The MSI SDK notes that scheduling RemoveExistingProducts early is &#8220;inefficient&#8221; because the files that are same between the two product versions are removed and then reinstalled. But that inefficiency is what lets you remove files and components. If you schedule RemoveExistingProducts immediately before or after <a href="http://msdn.microsoft.com/en-us/library/aa369505(VS.85).aspx">InstallFinalize</a>, MSI implements the major upgrade by installing the new version of the product &#8220;on top of&#8221; the previous version, upgrading files with newer versions, then removing the previous version. MSI increments the reference count of components in both packages during the installation of the newer version, then decrements it during the removal of the previous version. Component reference counting works only if component rules are followed, so it&#8217;s pretty much the same as minor upgrades.</p>
<p>If you have a large product, the size and install-time benefits of minor upgrade patches might be worth the development effort. Otherwise, major upgrades scheduled early are a great solution. Your call.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2008/12/30/paying-for-upgrades/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Neither more nor less</title>
		<link>http://www.joyofsetup.com/2008/12/29/neither-more-nor-less/</link>
		<comments>http://www.joyofsetup.com/2008/12/29/neither-more-nor-less/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 01:28:03 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[Windows Installer]]></category>
		<category><![CDATA[best practices]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2008/12/29/neither-more-nor-less/</guid>
		<description><![CDATA[&#8216;When I use a word,&#8217; Humpty Dumpty said, in a rather scornful tone,&#8217; it means just what I choose it to mean, neither more nor less.&#8217; &#8216;The question is,&#8217; said Alice, &#8216;whether you can make words mean so many different things.&#8217; &#8216;The question is,&#8217; said Humpty Dumpty, &#8216;which is to be master &#8211; that&#8217;s all.&#8217; [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8216;When <b>I</b> use a word,&#8217; Humpty Dumpty said, in a rather scornful tone,&#8217; it means just what I choose it to mean, neither more nor less.&#8217;</p>
<p>&#8216;The question is,&#8217; said Alice, &#8216;whether you <i>can</i> make words mean so many different things.&#8217;</p>
<p>&#8216;The question is,&#8217; said Humpty Dumpty, &#8216;which is to be master &#8211; that&#8217;s all.&#8217; </p>
<p>&#8211;<a href="http://en.wikipedia.org/wiki/Alice%27s_Adventures_in_Wonderland">Alice&#8217;s Adventures in Wonderland</a> and brought to mind by almost anybody reading SDK documentation for any length of time</p>
</blockquote>
<p>Windows Installer has three ways of upgrading products from one version to another:</p>
<ul>
<li>Major upgrades </li>
<li>Minor upgrades </li>
<li>Small updates </li>
</ul>
<p>There are two common problems we run into when discussing upgrades given size-related terms to describe upgrades.</p>
<h2>Version numbers</h2>
<p><em>Major</em> and <em>minor</em> are also commonly used to refer to particular elements in a version number (major.minor.build.patchlevel being most common). </p>
<p>But major upgrades can upgrade any product version number to any other version number, regardless of which parts of the version number change. For example, the WiX installers are always major upgrades for every 3.0.xxxx version; only the <em>build</em> portion of the version number changes with each weekly build. And the WiX v3.0 installers don&#8217;t do major upgrades down to WiX v2; we intentionally designed the installers to be able to live &quot;side-by-side&quot; on the same system to help migrating from WiX v2 to v3. </p>
<p>Minor upgrades, on the other hand, are usually used to deliver service packs; they must change some part of the product version but <em>can&#8217;t</em> change the major part of the product version (at least according to PatchWiz.dll error ERROR_PCW_INVALID_MAJOR_VERSION).</p>
<p>Small updates cannot change the product version at all.</p>
<h2>Size matters not</h2>
<p><em>Major</em>, <em>minor</em>, and <em>small</em> also bring to mind size or breadth of a particular upgrade. To an extent, that&#8217;s true: Small updates tend to be for single-purpose &quot;hotfix&quot; types of fixes. Minor upgrades can update many files but can make only limited &quot;structural&quot; changes such as adding features and components; they can&#8217;t be used to remove components. </p>
<p>Major upgrades aren&#8217;t so limited: They can change anything in a product, but also support as few changes as a small update. So even if you&#8217;re changing only a few files, you can still use major upgrades. Think of <em>major</em> as an upper limit on the set of changes, not the lower limit on the type of upgrade you need.</p>
<p>Major upgrades also have the advantage of built-in support in Windows Installer. Using <a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_upgrade.htm">Upgrade</a> and <a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_upgradeversion.htm">UpgradeVersion</a> elements, you can use a &quot;naked&quot; .msi package to install a product for the first time or by major-upgrading a prior version of the product. Doing the same thing with a minor upgrade requires a bootstrapper executable or extra work to set the <a href="REINSTALL">REINSTALL</a> and <a href="http://msdn.microsoft.com/en-us/library/aa371182(VS.85).aspx">REINSTALLMODE</a> properties appropriately.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2008/12/29/neither-more-nor-less/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Windows 7 MSI session at PDC</title>
		<link>http://www.joyofsetup.com/2008/09/26/windows-7-msi-session-at-pdc/</link>
		<comments>http://www.joyofsetup.com/2008/09/26/windows-7-msi-session-at-pdc/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 08:01:10 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[Windows Installer]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2008/09/26/windows-7-msi-session-at-pdc/</guid>
		<description><![CDATA[New/old lead program manager Tyler Robinson has a session at PDC to discuss the new features in Windows Installer and ClickOnce in Windows 7: If you are a developer involved in the creation of application deployment packages using Windows Installer (MSI) or ClickOnce, this session is for you. Learn how you can take advantage of [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.msdn.com/windows_installer_team/archive/2008/03/07/windows-installer-4-5-beta-2-coming-soon-and-a-chat-too.aspx">New/old lead program manager Tyler Robinson</a> has a session at PDC to discuss the new features in Windows Installer and ClickOnce in Windows 7:</p>
<blockquote><p>If you are a developer involved in the creation of application deployment packages using Windows Installer (MSI) or ClickOnce, this session is for you. Learn how you can take advantage of new features in Windows 7 to shorten application installation times, reduce UAC prompts, write less custom code, take less time to write installations for complex packages, and much more!</p>
</blockquote>
<p>Not a lot of detail, but some potentially interesting tidbits. To see the information available on the session:</p>
<ol>
<li>Go to the <a href="https://sessions.microsoftpdc.com/public/sessions.aspx">PDC sessions page</a>.</li>
<li>Click on <strong>Windows 7</strong>.</li>
<li>Scroll to the bottom of the list; it&#8217;s currently the sixth session from the bottom.</li>
</ol>
<p>Why am I not linking directly to the session? AJAX and Web 2.0, baby. <a href="http://blogs.msdn.com/oldnewthing/archive/2008/09/25/8965130.aspx">Not even Raymond Chen can make it happen.</a>&lt;sigh&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2008/09/26/windows-7-msi-session-at-pdc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hint: Be generous with upgrade codes</title>
		<link>http://www.joyofsetup.com/2008/09/07/hint-be-generous-with-upgrade-codes/</link>
		<comments>http://www.joyofsetup.com/2008/09/07/hint-be-generous-with-upgrade-codes/#comments</comments>
		<pubDate>Mon, 08 Sep 2008 00:33:45 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[Windows Installer]]></category>
		<category><![CDATA[bad practices]]></category>
		<category><![CDATA[best practices]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2008/09/07/hint-be-generous-with-upgrade-codes/</guid>
		<description><![CDATA[Major upgrades work across products by associating them with a single upgrade code: Version 1.0 of a product has a different product code than version 2.0 but both share the same upgrade code. The FindRelatedProducts action and MsiEnumRelatedProducts function find any products on the system with a particular upgrade code. The RemoveExistingProducts action then uninstalls [...]]]></description>
			<content:encoded><![CDATA[<p>Major upgrades work across products by associating them with a single upgrade code: Version 1.0 of a product has a different product code than version 2.0 but both share the same upgrade code. The <a href="http://msdn.microsoft.com/en-us/library/aa368600(VS.85).aspx">FindRelatedProducts action</a> and <a href="http://msdn.microsoft.com/en-us/library/aa370103(VS.85).aspx">MsiEnumRelatedProducts function</a> find any products on the system with a particular upgrade code. The <a href="http://msdn.microsoft.com/en-us/library/aa371197(VS.85).aspx">RemoveExistingProducts action</a> then uninstalls the (usually older) products as part of the major upgrade cycle.</p>
<p>Note that FindRelatedProducts and MsiEnumRelatedProducts explicitly support finding multiple products installed on the system simultaneously. MSI doesn&#8217;t try to force you to use the same upgrade code only for products that are upgraded by major upgrades. That means it&#8217;s possible to use the same upgrade code for products that aren&#8217;t major upgrades for each other.</p>
<p>However, the <a href="http://msdn.microsoft.com/en-us/library/aa372379(VS.85).aspx">Upgrade table</a> supports only version and language as ways of narrowing down the products it finds. So if you use the same upgrade code for multiple products that can be installed simultaneously, FindRelatedProducts doesn&#8217;t have a way to filter out the ones you don&#8217;t want removed in a major upgrade.</p>
<p>You can use a custom action to remove product codes from the property specified by the UpgradeVersion/@Property attribute. Just schedule it to run after FindRelatedProducts. The cost is that you have to maintain by hand any such product codes and carry them from version to version. </p>
<p>The Upgrade table and FindRelatedProducts action let you search on multiple upgrade codes in a single product. So it&#8217;s always safe to use <em>more</em> upgrade codes if you think you might support having products side-by-side in the future &#8212; just use multiple Upgrade elements to detect and uninstall them via major upgrade.</p>
<p>In short, if you have products are <em>never</em> going to be installed at the same time, you can safely use the same upgrade code. But if you have products that might need to be installed simultaneously, give them separate upgrade codes. (Upgrade code GUIDs are cheap when you buy them in quantity from <a href="http://msdn.microsoft.com/en-us/library/ms241442(VS.80).aspx">reputable online retailers</a>.) And always test your servicing strategy before you release a product: Some things can&#8217;t be fixed in a patch.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2008/09/07/hint-be-generous-with-upgrade-codes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Chrome setup</title>
		<link>http://www.joyofsetup.com/2008/09/02/google-chrome-setup/</link>
		<comments>http://www.joyofsetup.com/2008/09/02/google-chrome-setup/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 04:48:35 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[Windows Installer]]></category>
		<category><![CDATA[best practices]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2008/09/02/google-chrome-setup/</guid>
		<description><![CDATA[Google today released (after a bit of a comic-book&#160;pre-release, presumably due to the Labor Day holiday in the US) Google Chrome, its long-rumored open-source browser. Plenty of people will talk (endlessly) about the implications of another browser and how well Google Chrome and Chromium (the open source project) do the job. Blah, blah. Whatever. What&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>Google today released (after a bit of a <a href="http://www.google.com/googlebooks/chrome/">comic-book</a>&#160;<a href="http://blogoscoped.com/google-blog.html">pre-release</a>, presumably due to the Labor Day holiday in the US) <a href="http://www.google.com/chrome/">Google Chrome</a>, its long-rumored open-source browser. Plenty of people will talk (endlessly) about the implications of another browser and how well Google Chrome and <a href="http://code.google.com/chromium/">Chromium</a> (the open source project) do the job. Blah, blah. Whatever. What&#8217;s <em>really </em>interesting is a couple of choices Google made about deployment:</p>
<ol>
<li>The Google Chrome <a href="http://www.google.com/chrome/eula.html">download</a> is a svelte 474K bootstrapper that downloads the setup bits. No offline installer is available (unless it&#8217;s well-hidden). </li>
<li>Google Chrome is a &quot;composite&quot; setup: The guts of the application are installed by a non-MSI self-extractor. However, Google Chrome <a href="http://blogoscoped.com/google-chrome/34">includes Google Gears</a>, the browser add-in/library that adds a <a href="http://code.google.com/apis/gears/gears_faq.html">bunch of functionality for making apps-in-the-browser more powerful</a>. The Gears in Google Chrome is installed by an MSI package. And yes, it&#8217;s built with WiX. </li>
<li>The Google Updater is no longer a LocalSystem service; instead, it starts at logon from the HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run registry key. </li>
<li>Last and absolutely not least: Google Chrome is a per-user application. It even installs in the per-user LocalAppDataFolder. (The included Google Gears is marked as &quot;<a href="http://msdn.microsoft.com/en-us/library/aa372870(VS.85).aspx">UAC compliant</a>.&quot;) </li>
</ol>
<p>That Google Chrome is a per-user app is amazing. Even with UAC on Windows Vista and Windows Server 2008, it&#8217;s <em>so</em> easy to say that &quot;everyone&#8217;s used to needing admin privileges to install.&quot; That Google took the extra effort to limit themselves to the capabilities of a per-user app says a lot about their desire to have:</p>
<ul>
<li>a low-impact setup </li>
<li>and absolutely no barriers to entry. </li>
</ul>
<p>I wonder if it&#8217;s the start of a trend&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2008/09/02/google-chrome-setup/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Testing your deferred and rollback custom actions</title>
		<link>http://www.joyofsetup.com/2008/06/18/testing-your-deferred-and-rollback-custom-actions/</link>
		<comments>http://www.joyofsetup.com/2008/06/18/testing-your-deferred-and-rollback-custom-actions/#comments</comments>
		<pubDate>Thu, 19 Jun 2008 06:06:33 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[WiX]]></category>
		<category><![CDATA[Windows Installer]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[custom actions]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2008/06/18/testing-your-deferred-and-rollback-custom-actions/</guid>
		<description><![CDATA[When you include deferred custom actions &#8212; that somehow modify the machine &#8212; in your setup, you have two big responsibilities: Provide rollback custom actions that &#34;undo&#34; what the deferred CAs do so that the installation transaction is actually transactional. Test. Test. Test. OK, so numbers 2 through 4 are kinda the same but not [...]]]></description>
			<content:encoded><![CDATA[<p>When you include deferred custom actions &#8212; that somehow modify the machine &#8212; in your setup, you have two big responsibilities:</p>
<ol>
<li>Provide rollback custom actions that &quot;undo&quot; what the deferred CAs do so that the installation transaction is actually transactional. </li>
<li>Test. </li>
<li>Test. </li>
<li>Test. </li>
</ol>
<p>OK, so numbers 2 through 4 are kinda the same but not really: Even a simple installation (say, without patching or upgrades) has three different scenarios you need to test when you have deferred/rollback custom actions:</p>
<ol>
<li>Installation rollback. </li>
<li>Repair rollback. </li>
<li>Uninstallation rollback. </li>
<li>All of the above. </li>
</ol>
<p>The right behavior for each kind of rollback is usually the opposite action. Rolling back installation is uninstallation. Rolling back uninstallation is installation. Rolling back repair is usually installation. Mixing installation, repair, and uninstallation is possible if your package has user-selectable features and users go into maintenance mode to turn on and off features. And, of course, it&#8217;s always an option from the msiexec.exe command line using the ADDLOCAL/ADDSOURCE/ADDDEFAULT, REMOVE, and REINSTALL properties.</p>
<h2>Testing rollback means testing failure</h2>
<p>Windows Installer initiates rollback when an action fails, so to test rollback you need to cause a failure. WiX includes an easy way to trigger failure: The WixFailWhenDeferred custom action, part of WixUtilExtension, triggers a failure when it&#8217;s executed. Include it in your package by referencing WixUtilExtension (in your Votive .wixproj or via the -ext switch to the light.exe command line) and adding a CustomActionRef to your package authoring:</p>
<blockquote><p>&lt;CustomActionRef Id=&quot;WixFailWhenDeferred&quot; /&gt;</p>
</blockquote>
<p>WixFailWhenDeferred automatically schedules itself in InstallExecuteSequence before InstallFinalize, with a condition of:</p>
<blockquote><p>WIXFAILWHENDEFERRED=1</p>
</blockquote>
<p>The condition means that you can have one package to test all the different possible combinations of &quot;normal&quot; installation and rollback. Just pass the WIXFAILWHENDEFERRED=1 property value on the msiexec.exe command line to trigger rollback. For example:</p>
<blockquote><p>msiexec /qb- /i intermediate.msi /L*vx installfail.log WIXFAILWHENDEFERRED=1      <br />msiexec /qb- /i intermediate.msi /L*vx install.log       <br />msiexec /qb- /fvamus intermediate.msi /L*vx repairfail.log WIXFAILWHENDEFERRED=1       <br />msiexec /qb- /fvamus intermediate.msi /L*vx repair.log       <br />msiexec /qb- /x intermediate.msi /L*vx uninstallfail.log WIXFAILWHENDEFERRED=1       <br />msiexec /qb- /x intermediate.msi /L*vx uninstall.log</p>
</p>
</p>
</blockquote>
<p>WixFailWhenDeferred has been in WiX v3 weekly releases since April.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2008/06/18/testing-your-deferred-and-rollback-custom-actions/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>VirtualBox 1.6.2 drops VBScript</title>
		<link>http://www.joyofsetup.com/2008/06/13/virtualbox-162-drops-vbscript/</link>
		<comments>http://www.joyofsetup.com/2008/06/13/virtualbox-162-drops-vbscript/#comments</comments>
		<pubDate>Fri, 13 Jun 2008 14:40:06 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[Windows Installer]]></category>
		<category><![CDATA[best practices]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2008/06/13/virtualbox-162-drops-vbscript/</guid>
		<description><![CDATA[As I mentioned previously, one of my favorite examples of a tight, clean Windows Installer package for a real product&#8211;VirtualBox&#8211;succumbed to a dreaded VBScript custom action when they released v1.6.0. Predictably, it caused errors (during uninstallation, because this custom action ran during uninstall only). VirtualBox 1.6.2 dropped that custom action. The VirtualBox installers still have [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.joyofsetup.com/2008/05/05/virtualbox-160-setup-another-example-of-the-second-law-of-thermodynamics/">As I mentioned previously</a>, one of my favorite examples of a tight, clean Windows Installer package for a real product&#8211;<a href="http://www.virtualbox.org/">VirtualBox</a>&#8211;succumbed to a <a href="http://blogs.msdn.com/robmen/archive/2004/05/20/136530.aspx">dreaded</a> VBScript custom action when they released v1.6.0. <a href="http://forums.virtualbox.org/viewtopic.php?t=6140">Predictably, it caused errors</a> (during uninstallation, because this custom action ran during uninstall only).</p>
</p>
<p><a href="http://www.virtualbox.org/wiki/Changelog">VirtualBox 1.6.2</a> dropped that custom action. The VirtualBox installers still have a few ICE errors and warnings so here&#8217;s hoping the VirtualBox team continues cleaning those up.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2008/06/13/virtualbox-162-drops-vbscript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
