Heath has a really good blog post about what happens if you work with 64-bit
components in a 32-bit MSI package. The major limitation is that you can't
use a 64-bit directory since a Windows Installer supplied directory
reflection will always kick in on a 32-bit MSI. I found that reading it
about 5 times over several weeks leads to a better understanding of what he
discovered vs. just one read-through.

ICE80 is designed to make sure you don't build a 32-bit MSI that accesses
64-bit regions of the OS (since your 32-bit app can't normally reach them).
Have you run your Wise-generated MSI through either smoke or Orca's
validation? You will see the ICE80 error there if wise is generating a
32-bit marked MSI. Just because Wise lets you doesn't mean it builds
"clean".

You will need both 32-bit and 64-bit extensions installed on 64-bit Oss, to
support 32-bit applications.

The "correct" way is to build a 64-bit MSI for 64-bit OSs where all of your
components except for the 64-bit extension are 32-bit components, AND where
you place the 64-bit file in a 64-bit directory "by default". That doesn't
mean you don't allow the user to change the installation locations, it just
means you have two installation locations (one for the 32-bit code and one
for the 64-bit code). You could force the 64-bit location to the user's
expressed preference IF the user changed it via a custom action.

For just one component that writes one file and one registry key, that may
seem a bit much, however. Heath noted that a 64-bit component in a 32-bit
MSI will do two things: 1) the directory will be changed to the matching
32-bit directory, and 2) the registry won't be changed (you get the 64-bit
registry). But, you will always get ICE80 issues when you do that, since the
32-bit directory isn't "supposed to" contain 64-bit code.

One option is to build the 32-bit MSI with the 64-bit component. You
absolutely must add a "VersionNT64" condition on your 64-bit component
"GSIShell64" (there will never be any use of the 64-bit extension on a
32-bit OS) and you will need to suppress the ICE80 during light and ensure
that you don't have any additional ICE80 errors or warnings in subsequent
builds by regularly running smoke (or Orca) on your MSI and checking the
results. It isn't "kosher" but it will work.

I generally don't advocate this type of solution, but I also don't view all
the ICE tests as written as always entirely practical either. You may not be
able to get/retain a Logo doing this, since that requires a generally clean
ICE validation, so that should be weighed into your calculations.

-----Original Message-----
From: Nate Hekman [mailto:hek...@geo-slope.com] 
Sent: Tuesday, September 22, 2009 9:14 AM
To: WiX-users@lists.sourceforge.net
Subject: [WiX-users] Installing 64-bit shell extension with a 32-bit app

I have a 32-bit application that include a 32-bit shell extension dll
that handles thumbnails and a few other shell extensions.  I want to add
a 64-bit version of that same dll to the mix to get the same thumbnails
et al working in 64-bit Windows Explorer.

 

Can someone tell me (or point me to documentation) what the proper way
is to do this?

 

Here's what I've been using for the 32-bit dll.  The RegistryValue line
with [BINDIR] in the Value is the line that causes me trouble when I get
to 64-bit.

 

    <DirectoryRef Id="BINDIR"> 

      <Component Id="GSIShell"
Guid="2EAEEF9B-7385-4d12-811C-68E26FB5E66D">

        <File Id="GSIShellDLL" Source="$(var.TargetDir)GSI.Shell.dll"
KeyPath="yes" Checksum="yes"/>

        <RegistryKey Root="HKCR"
Key="CLSID\{5D1A01C2-BD6D-45c7-BC8E-C419E2F08B70}"
Action="createAndRemoveOnUninstall">

          <RegistryValue Type="string" Value="GszIconShlExt Class"/>

          <RegistryKey Key="InprocServer32"
Action="createAndRemoveOnUninstall">

            <RegistryValue Type="string"
Value="[BINDIR]\gsi.shell.dll"/>

            <RegistryValue Type="string" Name="ThreadingModel"
Value="Apartment"/>

          </RegistryKey>

        </RegistryKey>

      </Component>

    </DirectoryRef>

 

[BINDIR] is defined earlier in the .wxs file as:

 

      <Directory Id="TARGETDIR" Name="SourceDir">

        <Directory Id="ProgramFilesFolder">

          <Directory Id="COMPANYDIR" Name="MyCompany">

          <Directory Id="SOFTWAREDIR" Name="MyApplication">

            <Directory Id="BINDIR" Name="Bin"/>

          </Directory>

        </Directory>

      </Directory>

 

So on a 64-bit OS that installs the GSI.Shell.dll file into C:\Program
Files (x86)\MyCompany\MyApplication\Bin, and the Registry key
HKCR\Wow6432Node\CLSID\{5D1A01C2-BD6D-45c7-BC8E-C419E2F08B70}\InprocServ
er32's value is "C:\Program Files
(x86)\MyCompany\MyApplication\Bin\gsi.shell.dll".

 

Then I add the 64-bit dll similarly.  The file needs to be placed in the
same bin folder as the 32-bit version, but I want to be editing the
64-bit portion of the Registry, so I add Win64="yes" to the Component.

 

    <DirectoryRef Id="BINDIR"> 

      <Component Id="GSIShell64"
Guid="2EAEEF9B-7385-4d12-811C-68E26FB5E66D" Win64="yes">

        <File Id="GSIShell64DLL"
Source="$(var.TargetDir)GSI.Shell64.dll" KeyPath="yes" Checksum="yes"/>

        <RegistryKey Root="HKCR"
Key="CLSID\{5D1A01C2-BD6D-45c7-BC8E-C419E2F08B70}"
Action="createAndRemoveOnUninstall">

          <RegistryValue Type="string" Value="GszIconShlExt64 Class"/>

          <RegistryKey Key="InprocServer32"
Action="createAndRemoveOnUninstall">

            <RegistryValue Type="string"
Value="[BINDIR]\gsi.shell64.dll"/>

            <RegistryValue Type="string" Name="ThreadingModel"
Value="Apartment"/>

          </RegistryKey>

        </RegistryKey>

      </Component>

    </DirectoryRef>

 

This gives me an error on the RegistryValue line with [BINDIR] in the
Value:

 

Error LGHT0204: ICE80: This 64BitCompnent GSIShell64 uses 32BitDirectory
BINDIR.

 

I've done a lot of googling and most responses are "you shouldn't be
installing 64-bit dlls with a 32-bit app".  But that's absolutely not
true, as these dlls are used by the shell, not by my application.  There
must be other people with this same problem.  What's the solution?

 

Thanks for any help!

 

 

Nate

 

----------------------------------------------------------------------------
--
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
_______________________________________________
WiX-users mailing list
WiX-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wix-users


------------------------------------------------------------------------------
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
_______________________________________________
WiX-users mailing list
WiX-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wix-users

Reply via email to