如何:在开始菜单中创建快捷方式
如何:在开始菜单中创建快捷方式
安装应用程序的时候有一个共同的需求就是将快捷方式放到用户的开始菜单中来为程序提供一个启动点(a launching point )。本例演示了如何在开始菜单中创建一个快捷方式。这里假定你已经有了一个类似如何:添加文件到安装包中描述的WiX源文件。
第一步:定义文件夹结构
和通常的应用程序文件不同,开始菜单快捷方式安装在一个特定的文件夹,所以需要修改安装包的文件夹结构。把下面的WiX片段放在ID为TARGETDIR的<Directory>元素内部,并且为目录结构添加如下信息:
<Directory Id="ProgramMenuFolder"> <Directory Id="ApplicationProgramsFolder" Name="My Application Name"/> </Directory>
ID设置的ProgramMenuFolder为WIndows Installer内置的Property,指向目标机器上的开始菜单文件夹。第二个Directory元素在开始菜单创建一个命名为“My Application Name”的子目录,并且赋予了一个ID留给稍后的WiX工程引用。
第二步:添加快捷方式到安装包
添加快捷方式到安装包需要三个元素:用<Component>元素来指定一个安装的原子单元(atomic unit),用<Shortcut>元素来指定要安装的快捷方式,用<RemoveFolder>元素来确保应用程序卸载后快捷方式也被删除。
下面的例子使用了第一步中定义的文件夹结构来创建开始菜单快捷方式。
<DirectoryRef Id="ApplicationProgramsFolder"> <Component Id="ApplicationShortcut" Guid="PUT-GUID-HERE"> <Shortcut Id="ApplicationStartMenuShortcut" Name="My Application Name" Description="My Application Description" Target="[APPLICATIONROOTDIRECTORY]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>元素是用来引用第一步中定义的文件夹结构。通过引用ID为ApplicationProgramsFolder的Directory ,快捷方式将被安装到用户开始菜单的“My Application Name”目录下。
DirectoryRef下面是单个的Component用来将安装快捷方式的元素归纳(group)到一起。 第一个元素是一个Shortcut,它用来创建真正的(actual)快捷方式。ID属性是快捷方式唯一的识别。Name属性的值是显示在开始菜单上的名称。Description属性是一个用来附加应用程序描述的可选的属性。Target属性指出可执行文件在目标机器磁盘上的位置(快捷方式属性中的“目标”)。注意使用前面定义在目录结构中的ID为APPLICATIONROOTDIRECTORY的Property的方式。WorkingDirectory属性设置快捷方式的工作目录(快捷方式属性中的“起始位置”)。
如果需要为一个快捷方式设置一个图标,首先要使用<Icon>元素添加一个图标文件到你的安装包中,然后在Shortcut元素中使用Icon属性引用它。
除了创建快捷方式所用的Shortcut之外,Component还包括了两个重要的元素。首先是一个RemoveFolder元素,用来确保用户卸载应用程序时ApplicationProgramsFolder将被删除。第二个元素在安装时创建一个注册表键值来标识应用程序已被安装。 这是必须的,因为当安装包为当前用户安装快捷方式时不选择全部用户(译者注:安装时有“仅当前用户”和“全部用户”选择),Shortcut的属性KeyPath不能用来作为Component是否被安装的判定。(译者注:本句话很难理解,求翻译帝解释下“This is required as a Shortcut cannot serve as the KeyPath for a component when installing non-advertised shortcuts for the current users.”)。更多关于创建注册表键值的信息请看 如何:在执行安装时写注册表键值.
第三步:告诉Windows Installer安装快捷方式
在定义了文件夹结构并且列出了需要安装的快捷方式以后,最后一步就是告诉Windows Installer怎样实际的去安装快捷方式了。<Feature>元素就是用来做这个的。 下面的片段添加了一个指向包含了快捷方式的Component的引用,引用片段应该放置在一个父Feature里面。
<ComponentRef Id="ApplicationShortcut" />
<ComponentRef>元素通过第二部中定义的Id属性来引用Component。
完整示例
下面是一个上面代码的完整示例,这个示例可以被插入到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="[APPLICATIONROOTDIRECTORY]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>