[wix-users] Understanding Existing Code

Todd Hoatson todd.hoatson at gmail.com
Mon Jul 27 16:29:53 PDT 2020


Hi all,
  just wanting to double-check my thinking about some code we have (that I
didn't write, so I want to be sure I understand the logic)...

  Our main WiX file for our full-release installer has the following code
(I've simply changed some names):

    <Icon Id="CoolApp_Icon.ico" SourceFile=".\resources\CoolApp.ico" />

    <Directory Id='ProgramFilesFolder'>
        <Directory Id='APPFOLDER' Name='CoolApp 8'>
            <Component Id='RegKeyValues' Guid='*'>
                <RegistryKey Root='HKLM' Key='SOFTWARE\CoolApp\8'>
                    <RegistryValue Name="CoolApp_Files_Directory"
Type='string' Value='[APPFOLDER]'/>
                    <RegistryValue Name="CoolAppVersion" Type='string'
Value='$(var.VersionNumber)'/>
                </RegistryKey>
            </Component>

            <Component Id='RegKeySettingsDir' Guid='*' Permanent='yes'>
                <RegistryKey Root='HKLM' Key='SOFTWARE\CoolApp\8'>
                    <RegistryValue Name="Settings_Directory" Type='string'
Value='[PROJFOLDER]'/>
                </RegistryKey>
            </Component>

            <Component Id='CoolAppIcon' Guid='*'>
                <File Id='CoolAppIconFile' Name='CoolApp.ico'
Source='.\resources\CoolApp.ico' KeyPath='yes'/>
            </Component>
        </Directory>
    </Directory>

    <DirectoryRef Id="ProgramMenuFolder">
        <Component Id="ApplicationShortcutMenu" Guid="*">
            <Shortcut Id="ApplicationStartMenuShortcut"
                      Name="CoolApp 8"
                      Target="[APPFOLDER]CoolApp.exe"
                      WorkingDirectory="APPFOLDER"
                      Icon="CoolApp_Icon.ico"/>
            <RegistryValue Root="HKCU" Key="Software\Microsoft\CoolApp 8"
Name="installed" Type="integer" Value="1" KeyPath="yes"/>
        </Component>
    </DirectoryRef>

First, I encountered a problem where the AppIcon is left behind when the
app is uninstalled.  I can't see from this code why that would happen.  I'm
actually not sure why the AppIcon is being copied to the APPFOLDER in the
first place.  As long as the shortcuts are created with the icon file,
there shouldn't be any need for an icon file in the APPFOLDER, right?

Second, it seems like the registry value related to the shortcut should NOT
have Microsoft as part of its key, correct?

Third, I don't really see any need for the Registry Key with the Name
"Settings_Directory" to be handled in this Directory element. There seems
to be no relation between the two.  Am I missing something?  Maybe it's
just here so the code related to registry keys is kept in the same place...?

So, I wondered about separating the registry key stuff from the directory
elements, like so (similar to another app installer I worked on):

    <Icon Id="CoolApp_Icon.ico" SourceFile=".\resources\CoolApp.ico" />

    <Directory Id='ProgramFilesFolder'>
        <Directory Id='APPFOLDER' Name='CoolApp 8' />
    </Directory>

    <DirectoryRef Id="ProgramMenuFolder">
        <Component Id="ApplicationShortcutMenu" Guid="*">
            <Shortcut Id="ApplicationStartMenuShortcut"
                      Name="CoolApp 8"
                      Target="[APPFOLDER]CoolApp.exe"
                      WorkingDirectory="APPFOLDER"
                      Icon="CoolApp_Icon.ico"/>
            <RegistryValue Root="HKCU" Key="Software\Microsoft\CoolApp 8"
Name="installed" Type="integer" Value="1" KeyPath="yes"/>
        </Component>
    </DirectoryRef>

    <Component Id='RegKeyValues' Guid='*'>
        <RegistryKey Root='HKLM' Key='SOFTWARE\CoolApp\8'>
            <RegistryValue Name="CoolApp_Files_Directory" Type='string'
Value='[APPFOLDER]'/>
            <RegistryValue Name="CoolAppVersion" Type='string'
Value='$(var.VersionNumber)'/>
        </RegistryKey>
    </Component>

    <Component Id='RegKeySettingsDir' Guid='*' Permanent='yes'>
        <RegistryKey Root='HKLM' Key='SOFTWARE\CoolApp\8'>
              <RegistryValue Name="Settings_Directory" Type='string'
Value='[PROJFOLDER]'/>
        </RegistryKey>
    </Component>

Is this a better (cleaner? preferable?) way to structure the code?

thanks for helping me sort this out!

Todd Hoatson
Mobile: 763-291-3312
Email:   todd.hoatson at gmail.com
www.linkedin.com/in/toddhoatson


More information about the wix-users mailing list