单个包创作示例

示例PUASample.msi是能够在 Windows Server 2008 R2 和 Windows 7 上的每用户或每台计算机安装上下文中安装的双用途Windows Installer 5.0 包的示例。 此示例包遵循 单包创作中所述的开发准则。

获取示例的副本

此示例的副本和 Windows Installer 数据库表编辑器(Orca.exe)位于 Windows Installer 开发人员Windows SDK 组件中。 示例和表编辑器随 Windows Server 2008 R2 Windows软件开发工具包一起提供,Windows 7 作为Windows安装程序安装文件PUASample1.msi和Orca.msi。

系统要求

数据库编辑器 Orca.exe需要Windows Server 2008 R2 及更早版本以及Windows 7 及更早版本。 可以在 Windows Server 2008 R2 和 Windows 7 上的每台计算机或每用户安装上下文中安装双用途包PUASample1.msi。 PUASample1.msi只能在 Windows Server 2008 及更低版本以及 Windows Vista 及更早版本的每台计算机上下文中安装。 可以安装数据库编辑器来检查PUASample1.msi的内容,而无需安装示例。 若要安装示例或编辑器包,请确保 DisableMSI 策略未设置为阻止应用程序安装的值。

标识Dual-Purpose包

双用途包应将 MSIINSTALLPERUSER 属性的值初始化为 1。 这会将包标识为能够在 Windows Server 2008 R2 和 Windows 7 上的每台计算机或每用户上下文中安装。 仅当已按照单包创作中所述的开发准则编写包时,才在包中设置 MSIINSTALLPERUSER 属性,如果打算为用户提供在每用户或每台计算机上下文中安装包的选项。 双用途包还应将 ALLUSERS 属性的值初始化为 2。 这将按用户指定为应用程序的默认安装上下文。 如果 ALLUSERS 属性值是除 2 以外的任何值,Windows安装程序将忽略 MSIINSTALLPERUSER 属性。

使用 Windows Installer 数据库编辑器(如 Orca.exe)检查PUASample1.msi的内容。 示例包中的 Property 表包含以下两个条目。

财产 表 (部分)

属性
ALLUSERS 2
MSIINSTALLPERUSER 1

 

安装上下文的自定义对话框

示例包的 用户界面 包括自定义对话框 VerifyReadyDialog 的示例,该对话框允许用户在安装时选择每用户或每台计算机安装上下文。 对话框表包含描述 VerifyReadyDialog 对话框的记录。 “属性”字段中输入的值为 39,因为此对话框使用 msidbDialogAttributesVisible (1) , msidbDialogAttributesModal (2) 、msidbDialogAttributesMinimize (4) 和 msidbDialogAttributesTrackDiskSpace (32) 对话框样式位。 对话框的标题栏显示 ProductName 属性的值给定的标题。

对话 框 表 (部分)

对话框 HCentering VCentering 宽度 高度 属性 标题 Control_First Control_Default Control_Cancel
VerifyReadyDialog 50 50 480 280 39 [ProductName] InstallPerUser 下一步 取消

 

Control 表包含 VerifyReadyDialog 对话框显示的控件的条目。 对话框显示 PushButton 控件和 文本 控件。 所有控件都使用 msidbControlAttributesEnabled (2) 和 msidbControlAttributesVisible (1) 控件属性。 InstallPerMachine 控件还使用 ElevationShield 控件属性 msidbControlAttributesElevationShield (8388608.) 此控件属性会将 用户帐户控制 (UAC) 提升图标 (防护图标) 添加到 InstallPerMachine 控件,并通知用户,需要在每台计算机上下文中安装应用程序所需的 UAC 凭据。 控件表的“文本”字段中的值是控件显示的文本样式和文本。 有关使用预定义样式向控件添加文本的详细信息,请参阅“控件”表主题中的“文本”字段的说明。

控制 表 (部分)

Dialog_ 控制 类型 Attribute 文本 Control_Next
VerifyReadyDialog 取消 按钮 3 {\Tahoma10}&取消 下一步
VerifyReadyDialog 上一篇 按钮 3 {\Tahoma10}<<&以前 取消
VerifyReadyDialog 下一步 按钮 3 {\Tahoma10}&下 >> InstallPerUser
VerifyReadyDialog Text2 文本 3 是否准备好完成挂起的安装?
VerifyReadyDialog InstallPerUser 按钮 3 {\Tahoma10}仅为 &我安装 InstallPerMachine
VerifyReadyDialog InstallPerMachine 按钮 8388611 {\Tahoma10}为 &所有人安装 上一篇
VerifyReadyDialog 取消 按钮 3 {\Tahoma10}&取消 下一步

 

ControlEvent 表指定 ControlEvents 或操作,当用户与控件交互时,安装程序将执行该操作。 当用户激活 InstallPerUser pushbutton 时,如果 OutOfDiskSpace 属性为 1,则用户界面将显示 OutOfDisk 对话框,将 MSIINSTALLPERUSER 属性的值设置为 1,将 ALLUSERS 属性的值设置为 2,将 MSIFASTINSTALL 属性设置为 1,并返回。 由于 设置了 MSIFASTINSTALL 属性,因此不会为安装生成任何系统还原点。 当用户激活 InstallPerMachine pushbutton 时,如果 OutOfDiskSpace 属性为 1,用户界面将显示 OutOfDisk 对话框,将 ALLUSERS 属性的值设置为 1,并返回。

ControlEvent 表 (部分)

Dialog_ Control_ 事件 参数 条件 订单
VerifyReadyDialog InstallPerUser SpawnDialog OutOfDisk OutOfDiskSpace = 1 1
VerifyReadyDialog InstallPerUser EndDialog 返回 OutOfDiskSpace <> 1 5
VerifyReadyDialog InstallPerUser [MSIINSTALLPERUSER] 1 1 2
VerifyReadyDialog InstallPerUser [ALLUSERS] 2 1 3
VerifyReadyDialog InstallPerMachine SpawnDialog OutOfDisk OutOfDiskSpace = 1 1
VerifyReadyDialog InstallPerMachine EndDialog 返回 OutOfDiskSpace <> 1 3
VerifyReadyDialog InstallPerMachine [ALLUSERS] 1 1 2
VerifyReadyDialog InstallPerUser [MSIFASTINSTALL] 1 1 4

 

应使用早于 Windows Installer Windows Installer 5.0 的 Windows Installer 版本从任何安装的用户界面中删除 InstallPerUser 控件。 示例包中的 ControlCondition 表包含四个条目,如果当前版本小于 Windows Installer 5.0,则禁用和隐藏 InstallPerUser 控件。 该表使用 VersionMsi 属性的值和 条件语句语法 来定义此条件。 只有在 Condition 字段中的语句为 true 时,才执行 Action 字段中指定的操作。

ControlCondition 表 (部分)

Dialog_ Control_ 操作 条件
VerifyReadyDialog InstallPerUser 启用 VersionMsi >= “5.00”
VerifyReadyDialog InstallPerUser 禁用 VersionMsi < “5.00”
VerifyReadyDialog InstallPerUser 显示 VersionMsi >= “5.00”
VerifyReadyDialog InstallPerUser 隐藏 VersionMsi < “5.00”

 

指定目录结构

使用数据库编辑器检查PUASample1.msi的 目录 表。 目录表在其Directory_Parent字段中具有空字符串的记录表示源目录和目标目录树的根目录。 如果未定义 TARGETDIR 属性,安装程序会在安装时将其值设置为 ROOTDRIVE 属性的值。 如果未定义 SourceDir 属性,安装程序会将其值设置为包含 Windows Installer 包 (.msi file.) 使用短|long 格式指定目录名称的位置。

目录 表 (部分)

目录 Directory_Parent DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .
ProgramMenuFolder TARGETDIR .
INSTALLLOCATION MyVendor 示例 1|MSDN-PUASample1
MyVendor ProgramFilesFolder Msft|微软

 

在源处,此 Directory 表解析为以下目录路径。

\[SourceDir\]\\Msft\\Sample1 \[SourceDir\]

在目标处, Directory 表解析为下表中的路径。 安装程序将 ProgramFilesFolderProgramMenuFolder 属性的值设置为依赖于安装上下文的位置,以及系统是 32 位还是 64 位版本的 Windows Server 2008 R2 和 Windows 7。 目标文件夹的路径取决于用户是选择每用户还是按计算机安装。

安装上下文 系统 示例路径
Per-Machine Windows Server 2008 R2 和 Windows 7
32 位版本
%ProgramFiles%\Msft\Sample1
%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs
Per-Machine Windows Server 2008 R2 和 Windows 7
64 位版本
%ProgramFiles (x86) %\Msft\Sample1
%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs
Per-User Windows Server 2008 R2 和 Windows 7
32 位或 64 位版本
%USERPROFILE%\AppData\Local\Programs\Msft\Sample1
%APPDATA%\Microsoft\Windows\"开始"菜单 Menu\Programs

 

每用户应用程序应存储在 ProgramFilesFolder 属性的值指定的 Programs 文件夹下的子文件夹中。 通常,应用程序的路径采用以下形式。

%LOCALAPPDATA%\Programs\ISVnameAppName\。

每用户配置数据应存储在 ProgramMenuFolder 属性的值指定的 Programs 文件夹中。 通常,此文件夹位于以下路径。

%APPDATA%\Microsoft\Windows\"开始"菜单 Menu\Programs

如果安装 32 位Windows安装程序包组件,请使用 Directory 表中的 ProgramFilesFolderCommonFilesFolder 属性。 如果安装 64 位Windows安装程序包组件,请使用 ProgramFiles64FolderCommonFiles64Folder 属性。 如果应用程序包含同一组件的 32 位和 64 位版本,则使用相同的名称,请确保这些版本保存在不同的目录中或为其指定不同的名称。

以下 Directory 表提供了与包含 32 位和 64 位组件的包兼容的目录布局示例,并包含跨应用程序共享的某些组件。

目录 Directory_Parent DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .:P rog32
ProgramFiles64Folder TARGETDIR .:P rog64
CommonFilesFolder TARGETDIR .:Share32
CommonFiles64Folder TARGETDIR .:Share64
ProgramMenuFolder TARGETDIR .:Sample1|MSDN-PUASample1
INSTALLLOCATION MyVendor 示例 1|MSDN-PUASample1
INSTALLLOCATIONX64 Vendorx64 示例 1|MSDN-PUASample1
SHAREDLOCATION ShVendor 示例 1|MSDN-PUASample1
SHAREDLOCATIONX64 ShVendorx64 示例 1|MSDN-PUASample1
MyVendor ProgramFilesFolder Msft|微软
Vendorx64 ProgramFiles64Folder Msft|微软
ShVendor CommonFilesFolder Msft|微软
ShVendorx64 CommonFiles64Folder Msft|微软
Shrx86 SHAREDLOCATION x32|32 位组件
Shrx64 SHAREDLOCATIONX64 x64|64 位组件
Binx86 INSTALLLOCATION x32|32 位组件
Binx64 INSTALLLOCATIONX64 x64|64 位组件
App32 Binx86 myapp|unshared 32 位组件
App64 Binx64 myapp|unshared 64 位组件
Share32 Shrx86 共享|共享的 32 位组件
Share64 Shrx64 共享|共享 64 位组件

 

在源中,此 目录 表解析为以下目录路径。

\[SourceDir\]Prog32\\Msft\\Sample1\\x32\\myapp \[SourceDir\]Share32\\Common Files\\Msft\\Sample1\\x32\\shared \[SourceDir\]Prog64\\Msft\\Sample1\\x64\\myapp \[SourceDir\]Share64\\Common Files\\Msft\\Sample1\\x64\\shared \[SourceDir\]Sample1

在目标位置,此 目录 表解析为以下目录路径。 目标路径取决于 安装上下文 和系统。

安装上下文 系统 示例路径
Per-Machine Windows Server 2008 R2 和 Windows 7
32 位版本
%ProgramFiles%\Msft\Sample1\x32\myapp
%ProgramFiles%\Common Files\Msft\Sample1\x32\shared
%ProgramFiles (x86) %\Msft\Sample1\x64\myapp
%ProgramFiles (x86) %\Common Files\Msft\Sample1\x64\shared
%ProgramData%\Microsoft\Windows\"开始"菜单 Menu\Programs\Sample1
Per-Machine Windows Server 2008 R2 和 Windows 7
64 位版本
%ProgramFiles (x86) %\Msft\Sample1\x32\myapp
%ProgramFiles (x86) %\Common Files\Msft\Sample1\x32\shared
%ProgramFiles%\Msft\Sample1\x64\myapp
%ProgramFiles%\Common Files\Msft\Sample1\x64\shared
%ProgramData%\Microsoft\Windows\"开始"菜单 Menu\Programs\Sample1
Per-User Windows Server 2008 R2 和 Windows 7
32 位或 64 位版本
%LOCALAPPDATA%\Programs\Msft\Sample1\x32\myapp
%LOCALAPPDATA%\Programs\Common\Msft\Sample1\x32\shared
%LOCALAPPDATA%\Programs\Msft\Sample1\x64\myapp
%LOCALAPPDATA%\Programs\Common\Msft\Sample1\x64\shared
%APPDATA%\Microsoft\Windows\"开始"菜单 Menu\Programs\Sample1

 

应用程序注册

PUASample.msi将子项添加到应用程序的“应用路径”注册表项中,并执行注册,使应用程序信息能够保存在此密钥下的注册表中。 有关应用路径和应用程序注册的详细信息,请参阅 Shell 开发人员指南shell 扩展性部分中的 PerceivedTypes、SystemFileAssociations 和应用程序注册。 在安装时,用户决定在每用户或每台计算机安装上下文中安装应用程序。 在创作双用途包时,包开发人员无法知道是否应在HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER密钥下执行注册。

包开发人员在文件表的“文件”字段中为应用程序的可执行文件定义 文件 标识符。

文件 表 (部分)

文件 Component_ FileName FileSize 版本 语言 属性 序列
MyAppFile ProductComponent PUASAMP1.EXE|PUASample1.exe 81920 0 1

 

要在注册表中保存的值可以在 注册表 表的“值”字段中指定为 格式化 字符串。 使用在 “文件 ”表的“文件”字段中定义的文件标识符以及格式化类型的 [#filekey] 约定来指定应用路径注册表项的默认值。 顶级 INSTALL 操作在 InstallExecuteSequence 表中执行操作。 完成此表中的 CostInitializeFileCostInstallFinalize 操作后,Windows Installer 会将注册表表中格式化的子字符串 [#MyAppFile] 替换为应用程序文件的完整路径。

该示例定义自定义属性 RegRoot 以包含根密钥的位置,并在用户选择每台计算机安装时使用自定义操作重置属性值。 在引用根位置的任何格式字符串值中使用自定义属性 RegRoot。 在 “属性” 表中,PUASample.msi包定义自定义属性,并将 RegRoot 的值设置为 HKCU。 这会初始化每用户安装上下文的属性的值,这是针对双用途包的建议默认上下文。

财产 表 (部分)

属性
RegRoot HKCU

 

CustomAction 表中,包定义名为Set_RegRoot_HKLM的自定义操作。 Type 字段中的值将此标识为 自定义操作类型 51 标准自定义操作。 CustomAction 表中的“源”和“目标”字段的含义取决于自定义操作类型。 有关自定义操作的标准类型的详细信息,请参阅 自定义操作类型。 Set_RegRoot_HKLM自定义操作的源字段指定 RegRoot 属性的值。 如果安装程序执行Set_RegRoot_HKLM自定义操作,则将 RegRoot 属性的值重置为 HKLM。

CustomAction 表 (部分)

操作 类型 目标
Set_RegRoot_HKLM 51 [RegRoot] HKLM

 

顶级 INSTALL 操作在 InstallExecuteSequence 表中,在该表的 Sequence 字段中指定的序列中执行操作。 Set_RegRoot_HKLM自定义操作的 Sequence 字段中创作的值 (1501) 指定在 InstallInitialize 操作 (1500) 之后以及 ProcessComponents 操作 (1600.) 此序列之前执行此自定义操作可确保在安装时评估Set_RegRoot_HKLM自定义操作的记录。 有关 InstallExecuteSequence 表中建议的操作序列的详细信息,请参阅 建议的 InstallExecuteSequence 主题。 条件字段中创作 的条件语句语法 指定仅在安装时 ALLUSERS 属性的值计算结果为 1 时执行Set_RegRoot_HKLM操作。 ALLUSERS 属性值为 1 指定每台计算机安装。

InstallExecuteSequence 表 (部分)

操作 条件 序列
Set_RegRoot_HKLM ALLUSERS=1 1501

 

如果安装了 ProductComponent 组件, 注册表 表中的以下记录将执行注册。 “根”字段中的值 -1 需要对每个用户的安装执行HKEY_LOCAL_MACHINE下的注册,在HKEY_CURRENT_USER下执行每用户安装。 注册表字段中包含空字符串的记录在 AppPaths 注册表项下为应用程序添加一个子项,并将“ (默认) ”值设置为应用程序可执行文件的完整路径。 MyAppPathAlias 注册会将可执行文件映射到应用程序别名,并且如果用户在命令行提示符处键入别名“puapct”,则允许启动该应用程序。 MyAppPathRegistration 注册将可执行文件的名称映射到文件的完整路径。

注册表 Root 名称 组件
-1 Software\Microsoft\MyAppPathRegistrationLocation [RegRoot]\Software\Microsoft\Windows\CurrentVersion\App Paths\PUAPCT.exe ProductComponent
MyAppPathAlias -1 Software\Microsoft\Windows\CurrentVersion\App Paths\PUAPCT.exe [#MyAppFile] ProductComponent
MyAppPathRegistration -1 Software\Microsoft\Windows\CurrentVersion\App Paths\PUASample1.exe [#MyAppFile] ProductComponent

 

自动播放取消注册

PUASample.msi执行注册,使应用程序用户能够阻止针对所选设备启动 硬件自动播放 。 有关注册处理程序以取消自动播放以响应事件的信息,请参阅 Shell 开发人员指南shell 扩展性部分中用于 AutoPlay 主题的准备硬件和软件。 以下记录在安装 ProductComponent 组件时注册在“名称”字段中指定的处理程序。 “根”字段中的值 -1 需要指定给Windows安装程序,该安装程序应将注册重定向到依赖于安装上下文的位置。

注册 表

注册表 Root 名称 组件
MyAutoplayCancelRegistration -1 SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\CancelAutoplay\CLSID 66A32FE6-229D-427b-A608-D273F40C034C ProductComponent

 

预览处理程序注册

PUASample.msi执行安装 预览处理程序 所需的注册,该处理程序支持 .pua 文件的只读预览,而无需启动应用程序。 有关注册预览处理程序的信息,请参阅 Shell 开发人员指南shell 扩展性部分中的“注册预览处理程序”主题。 注册表表中的以下记录在安装 ProductComponent 组件时注册处理程序。 “根”字段中的值 -1 需要指定给Windows安装程序,该安装程序应将注册重定向到依赖于安装上下文的位置。

注册 表

注册表 Root 名称 组件
MyPreviewHandlerRegistration1 -1 Software\Classes\.pua puafile ProductComponent
MyPreviewHandlerRegistration2 -1 Software\Microsoft\Windows\CurrentVersion\PreviewHandlers {1531d583-8375-4d3f-b5fb-d23bbd169f22} Microsoft Windows PUA TEST 预览处理程序 ProductComponent
MyPreviewHandlerRegistration3 -1 Software\Classes\puafile\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f} {1531d583-8375-4d3f-b5fb-d23bbd169f22} ProductComponent
MyPreviewHandlerRegistration4 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} Per-User Applicaton 示例 1 预览处理程序 ProductComponent
MyPreviewHandlerRegistration5 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} AppID {6d2b5079-2f0b-48dd-ab7f-97cec514d30b} ProductComponent
MyPreviewHandlerRegistration6 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} DisplayName @shell32,-38242 ProductComponent
MyPreviewHandlerRegistration7 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} 图标 notepad.exe,2 ProductComponent
MyPreviewHandlerRegistration8 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 ThreadingModel 公寓 ProductComponent
MyPreviewHandlerRegistration9 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 #%SystemRoot%\system32\shell32.dll ProductComponent
MyPreviewHandlerRegistration10 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 ProgID puafile ProductComponent