admin 发表于 2017-4-8 13:53:30

WiX Toolset使用技巧——快捷方式处理

在开始菜单中创建快捷方式
当我们安装应用时,在用户的开始菜单中添加启动应用的快捷方式是一个普遍需求。本节将介绍如何在开始菜单中创建快捷方式。我们假设你有一个WiX源文件,并且配置了文件内容,关于文件配置详见: 译文:WiX Toolset使用技巧——文件处理 。

步骤1:定义目录结构
因为开始菜单快捷方式要安装在与常规应用文件不同的目录下,因此我们需要修改安装目录结构。以下WiX代码段需要放在Id值为TARGETDIR的 <Directory> 元素下,同时我们在为开始菜单添加目录结构信息:
<Directory Id="ProgramMenuFolder">
    <Directory Id="ApplicationProgramsFolder" Name="My Application Name"/>
</Directory>
Id值ProgramMenuFolder是一个标准的Windows安装程序属性 —— 用于指向目标机器的开始菜单文件夹。第二个目录元素在开始菜单下创建了一个名为My Application Name的子文件夹,并同时给其赋了一个Id值,以供WiX项目其他位置使用。

步骤2:添加快捷方式到安装包
使用以下三个元素将快捷方式添加到安装程序中:

一个 <Component> 元素 —— 指定安装的最小单位
一个 <Shortcut> 元素 —— 指定需要安装的快捷方式
一个 <RemoveFolder> 元素 —— 确保在卸载应用程序时进行合理的清理。
以下 代码使用了步骤1中的目录结构,并创建了开始菜单快捷方式。
<DirectoryRef Id="ApplicationProgramsFolder">
    <Component Id="ApplicationShortcut" Guid="PUT-GUID-HERE">
      <Shortcut Id="ApplicationStartMenuShortcut"
                Name="My Application Name"
                Description="My Application Description"
                Target="[#myapplication.exe]"
                WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
      <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
      <RegistryValue Root="HKCU" Key="Software\Microsoft\MyApplicationName" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
    </Component>
</DirectoryRef>
<DirectoryRef>
元素用于引用步骤1中创建的目录结构。通过引用ApplicationProgramsFolder目录,快捷方式将会安装到开始菜单的My Application Name文件夹下面。

DirectoryRef下面是一个独立的组件 —— 用于组合安装快捷方式的元素。第一个元素是Shortcut,它在开始菜单中创建 实际的快捷方式。快捷方式的Id属性值是一个唯一值。Name属性是在开始菜单中显示的文本。Description属性则是一个可选属性,它用于添加额外的应用描述。Target属性则指向磁盘 上要启动的可执行文件。注意,它通过使用 [#FileId] 的语法来引用完整路径,其中 myapplication.exe 是在之前定义的内容。WorkingDirectory属性则设置快捷方式的工作目录。

如果你需要为快捷方式设置一个可选的图标,你首先需要使用 <Icon> 元素将图标包含到安装包中,然后在Shortcut元素的Icon属性上引用它。

另外,添加快捷方式部件还含有另外两个重要部分。第一个部分是RemoveFolder元素,用于确保在用户卸载应用时能够从开始菜单中正确移除ApplicationProgramsFolder。第二个部分是在安装时创建一个注册表项,用于指示应用已安装。这是必需的,因为在为当前用户安装非广告的快捷方式时,快捷方式是不能作为组件的KeyPath —— 即组件需要一个KeyPath,所以添加了 一个注册表项。关于更多创建 注册表项的内容详见: 原文:How To: Write a registry entry during installation

步骤3:告诉Windows安装程序要安装的快捷方式
在为安装包定义了目录结构和列出了快捷方式后,最后一步就是告诉Windows安装程序要安装的快捷方式了。我们使用 <Feature> 元素来处理。以下代码段添加了快捷方式组件的引用,并需要将它插入到一个Feature元素内:
<ComponentRef Id="ApplicationShortcut" />
其中 <ComponentRef> 元素通过Id属性来引用步骤2中创建的部件。

完整示例
下面的完整示例使用了以上的内容。此示例可以添加到WiX项目中编译,或者通过命令行编译链接,以此生成安装包:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="1.0.0.0" Language="1033" Name="My Application Name" Manufacturer="My Manufacturer Name">
      <Package InstallerVersion="300" Compressed="yes"/>
      <Media Id="1" Cabinet="myapplication.cab" EmbedCab="yes" />

      <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="APPLICATIONROOTDIRECTORY" Name="My Application Name"/>
            </Directory>
            <!-- Step 1: Define the directory structure -->
            <Directory Id="ProgramMenuFolder">
                <Directory Id="ApplicationProgramsFolder" Name="My Application Name"/>
            </Directory>
      </Directory>

      <DirectoryRef Id="APPLICATIONROOTDIRECTORY">
            <Component Id="myapplication.exe" Guid="PUT-GUID-HERE">
                <File Id="myapplication.exe" Source="MySourceFiles\MyApplication.exe" KeyPath="yes" Checksum="yes"/>
            </Component>
            <Component Id="documentation.html" Guid="PUT-GUID-HERE">
                <File Id="documentation.html" Source="MySourceFiles\documentation.html" KeyPath="yes"/>
            </Component>
      </DirectoryRef>

      <!-- Step 2: Add the shortcut to your installer package -->
      <DirectoryRef Id="ApplicationProgramsFolder">
            <Component Id="ApplicationShortcut" Guid="PUT-GUID-HERE">
                <Shortcut Id="ApplicationStartMenuShortcut"
                  Name="My Application Name"
                Description="My Application Description"
                  Target="[#myapplication.exe]"
                        WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
                <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
                <RegistryValue Root="HKCU" Key="Software\Microsoft\MyApplicationName" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
      </Component>
      </DirectoryRef>

      <Feature Id="MainApplication" Title="Main Application" Level="1">
            <ComponentRef Id="myapplication.exe" />
            <ComponentRef Id="documentation.html" />
            <!-- Step 3: Tell WiX to install the shortcut -->
            <ComponentRef Id="ApplicationShortcut" />   
      </Feature>
    </Product>
</Wix>
创建网页的快捷方式

WiX支持在安装过程中创建网址快捷方式。本节将演示如何为你的安装程序引用必要的工具库并添加Internet的快捷方式。本节学习基础:先学习上一节的“在开始菜单中创建快捷方式”。

步骤1:为项目添加WiX工具扩展库
WiX对网页快捷方式的支持在WiX扩展库中,所以你需要先将它添加到项目中。如果你是通过命令行使用WiX,则你可以使用以下命令:

-ext WiXUtilExtension
如果你通过Visual Studio来使用Wix,则你可以使用以下步骤添加扩展引用:

在Visual Studio中打开WiX项目
在解决方案管理器中右键项目,然后选择添加引用
在列表中选择 WixUtilExtension.dll 程序集,然后点击添加
关闭添加 引用对话框
步骤2:为项目添加WiX工具扩展库命名空间

在将库添加到项目中后,你需要向项目中添加工具扩展库的命名空间,以便于你可以访问到相应的WiX元素。添加命名空间可以通过修改项目中的顶级 <Wix> 元素来处理 —— 添加如下代码:
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
具有标准命名空间和Utility扩展 命名空间的完整Wix元素示例如下:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
步骤3:添加Internet快捷方式到安装包中

Intertnet快捷方式通过 <Util:InternetShortcut> 元素创建。下面示例展示了如何添加一个InternetShortcut元素 —— 在上一节示例基础上修改的:
<DirectoryRef Id="ApplicationProgramsFolder">
    <Component Id="ApplicationShortcut" Guid="PUT-GUID-HERE">
      <Shortcut Id="ApplicationStartMenuShortcut"
                Name="My Application Name"
                Description="My Application Description"
                Target="[#MyApplicationExeFileId]"
                WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
      <util:InternetShortcut Id="OnlineDocumentationShortcut"
                        Name="My Online Documentation"
                            Target="http://wixtoolset.org/"/>
      <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
      <RegistryValue Root="HKCU" Key="Software\Microsoft\MyApplicationName" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
    </Component>
</DirectoryRef>
其中InternetShortcut为Id属性设置了唯一id,并且它位于应用的开始菜单文件夹下。Name属性指定了在开始菜单中显示的快捷方式名称。Target属性指定了快捷方式指向的目标地址。 <DirectoryRef> 元素则用于引用在项目文件中定义的目录结构。通过引用ApplicationProgramsFolder目录,快捷方式将会被安装到用户开始菜单的My Application Name文件夹下面。

创建卸载快捷方式
当安装应用时,在开始菜单中提供卸载应用的快捷方式通常也是一个普遍需求。本节将演示在开始菜单中创建通过所有ICE验证检查的卸载快捷方式所需的步骤。

本节学习基础:已经学习如何在开始菜单中创建快捷方式 —— 本文第一部分。

步骤1:添加卸载快捷方式
使用 <Shortcut> 元素添加卸载快捷方式到开时菜单,同时将快捷方式指向msiexec.exe(实际调用卸载操作的Windows Installer可执行文件)。在ApplicationShortcut部件 中的任何位置添加以下内容:
<Shortcut Id="UninstallProduct"            
      Name="Uninstall My Application"
      Target="msiexec.exe"
      Arguments="/x "
      Description="Uninstalls My Application" />
Target属性指向msiexec.exe位置。其中SystemFolder属性将解析为msiexec.exe所在的System32目录。Arguments属性通知msiexec.exe要卸载哪个产品 —— 通过传递ProductCode值。

为了避免在构建时的ICE验证错误,同时添加快捷方式和注册表项以及RemoveFolder元素是重要的。关于它们的描述可以看本文第一部分:在开始菜单 中创建快捷方式。

完整示例
下面的完整示例使用了以上的内容。此示例可以添加到WiX项目中编译,或者通过命令行编译链接,以此生成安装包:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="1.0.0.0" Language="1033" Name="My Application Name" Manufacturer="My Manufacturer Name">
      <Package InstallerVersion="300" Compressed="yes"/>
      <Media Id="1" Cabinet="myapplication.cab" EmbedCab="yes" />

      <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="APPLICATIONROOTDIRECTORY" Name="My Application Name"/>
            </Directory>
            <Directory Id="ProgramMenuFolder">
                <Directory Id="ApplicationProgramsFolder" Name="My Application Name"/>
            </Directory>
      </Directory>

      <DirectoryRef Id="APPLICATIONROOTDIRECTORY">
            <Component Id="myapplication.exe" Guid="PUT-GUID-HERE">
                <File Id="myapplication.exe" Source="MySourceFiles\MyApplication.exe" KeyPath="yes" Checksum="yes"/>
            </Component>
            <Component Id="documentation.html" Guid="PUT-GUID-HERE">
                <File Id="documentation.html" Source="MySourceFiles\documentation.html" KeyPath="yes"/>
            </Component>
      </DirectoryRef>

      <DirectoryRef Id="ApplicationProgramsFolder">
            <Component Id="ApplicationShortcut" Guid="PUT-GUID-HERE">
                <Shortcut Id="ApplicationStartMenuShortcut"
                  Name="My Application Name"
                Description="My Application Description"
                  Target="[#myapplication.exe]"
                        WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
                <!-- Step 1: Add the uninstall shortcut to your installer package -->
                <Shortcut Id="UninstallProduct"            
                        Name="Uninstall My Application"
                        Description="Uninstalls My Application"
                        Target="msiexec.exe"
                        Arguments="/x "/>
                <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
                <RegistryValue Root="HKCU" Key="Software\Microsoft\MyApplicationName" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
      </Component>
      </DirectoryRef>

      <Feature Id="MainApplication" Title="Main Application" Level="1">
            <ComponentRef Id="myapplication.exe" />
            <ComponentRef Id="documentation.html" />
            <ComponentRef Id="ApplicationShortcut" />   
      </Feature>
    </Product>
</Wix>
页: [1]
查看完整版本: WiX Toolset使用技巧——快捷方式处理