单个包创作示例

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

获取示例的副本

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

系统要求

数据库编辑器(Orca.exe)Windows Server 2008 R2 及更早版本以及 Windows 7 及更早版本。 PUASample1.msi 可以在 Windows Server 2008 R2 和 Windows 7上的每台计算机或每用户安装上下文中安装双重用途包 Windows 包。 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 安装程序数据库编辑器(如Orca.exe)检查 PUASample1.msi。 示例 中的 Property 表包含以下两个条目。

属性 表 (部分)

属性
ALLUSERS 2
MSIINSTALLPERUSER 1

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

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

对话框 表 (部分)

对话框 HCentering VCentering 宽度 高度 特性 标题 控制 _ 第一 控件 _ 默认值 控件 _ 取消
VerifyReadyDialog 50 50 480 280 39 ProductName[] InstallPerUser 下一步 取消

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

控件 表 (部分)

对话框_ 控件 类型 Attribute 文本 控制下 _ 一步
VerifyReadyDialog 取消 按钮 3 { \ Ta一0}&Cancel 下一步
VerifyReadyDialog 上一篇 按钮 3 { \ Ta一0}<<&上一个 取消
VerifyReadyDialog 下一步 按钮 3 { \ Ta一0}&下一 >> InstallPerUser
VerifyReadyDialog Text2 文本 3 是否已准备好完成挂起的安装?
VerifyReadyDialog InstallPerUser 按钮 3 { \ Ta分 10}仅针对&安装 InstallPerMachine
VerifyReadyDialog InstallPerMachine 按键 8388611 \为每个人 &安装 {Tahoma10} 上一篇
VerifyReadyDialog 取消 按键 3 { \ Tahoma10} &取消 下一步

ControlEvent表指定在用户与控件进行交互时安装程序执行的事件(或操作)。 用户激活 "InstallPerUser" 按钮时,如果 OutOfDiskSpace 属性为1,则用户界面将显示 "OutOfDisk" 对话框,将 " MSIINSTALLPERUSER " 属性的值设置为 "1",将 " ALLUSERS " 属性的值设置为 "2",将 MSIFASTINSTALL 属性设置为1,然后返回。 由于已设置 MSIFASTINSTALL 属性,因此不会为安装生成系统还原点。 用户激活 "InstallPerMachine" 按钮时,如果 OutOfDiskSpace 属性为1,则用户界面将显示 "OutOfDisk" 对话框,并将 " ALLUSERS " 属性的值设置为 "1",并返回。

ControlEvent Table (分部)

对话框_ 控件_ 事件 参数 条件 订单
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 控件。 如果当前版本低于 Windows Installer 5.0,示例包中的ControlCondition表包含四个禁用和隐藏 InstallPerUser 控件的条目。 该表使用 VersionMsi 属性的值和 条件语句语法 来定义此条件。 仅当条件字段中的语句为 true 时,才执行 "操作" 字段中指定的操作。

ControlCondition Table (分部)

对话框_ 控件_ 操作 条件
VerifyReadyDialog InstallPerUser 启用 VersionMsi >= "5.00"
VerifyReadyDialog InstallPerUser 禁用 VersionMsi < "5.00"
VerifyReadyDialog InstallPerUser 显示 VersionMsi >= "5.00"
VerifyReadyDialog InstallPerUser 隐藏 VersionMsi < "5.00"

指定目录结构

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

目录 Table (分部)

Directory 目录 _ 父级 DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .
ProgramMenuFolder TARGETDIR .
INSTALLLOCATION MyVendor Sample1 | MSDN-PUASample1
MyVendor ProgramFilesFolder Msft | Microsoft

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

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

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

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

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

% LOCALAPPDATA% \ 程序 \ ISV 名称 \ AppName

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

% APPDATA% \ Microsoft \ Windows \ 开始菜单 \ 程序

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

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

Directory 目录 _ 父级 DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR 。:P rog32
ProgramFiles64Folder TARGETDIR 。:P rog64
CommonFilesFolder TARGETDIR .:Share32
CommonFiles64Folder TARGETDIR .:Share64
ProgramMenuFolder TARGETDIR .: Sample1 | MSDN-PUASample1
INSTALLLOCATION MyVendor Sample1 | MSDN-PUASample1
INSTALLLOCATIONX64 Vendorx64 Sample1 | MSDN-PUASample1
SHAREDLOCATION ShVendor Sample1 | MSDN-PUASample1
SHAREDLOCATIONX64 ShVendorx64 Sample1 | MSDN-PUASample1
MyVendor ProgramFilesFolder Msft | Microsoft
Vendorx64 ProgramFiles64Folder Msft | Microsoft
ShVendor CommonFilesFolder Msft | Microsoft
ShVendorx64 CommonFiles64Folder Msft | Microsoft
Shrx86 SHAREDLOCATION x32 | 32 位组件
Shrx64 SHAREDLOCATIONX64 x64 | 64 位组件
Binx86 INSTALLLOCATION x32 | 32 位组件
Binx64 INSTALLLOCATIONX64 x64 | 64 位组件
App32 Binx86 myapp | 非共享 32 位组件
App64 Binx64 myapp | 非共享 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 \] 示例 1

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

安装上下文 系统 示例路径
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 \ 开始菜单 \ 程序示例 \ 1
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 \ 开始菜单 \ 程序示例 \ 1
Per-User Windows Server 2008 R2 和 Windows 7
32 位或 64 位版本
%LOCALAPPDATA% \ Programs \ Msft \ Sample1 \ x32 \ myapp
%LOCALAPPDATA% \ 程序 \ 常见 \ Msft \ Sample1 \ x32 \ 共享
%LOCALAPPDATA% \ Programs \ Msft \ Sample1 \ x64 \ myapp
%LOCALAPPDATA% \ 程序 \ 常用 \ Msft \ Sample1 \ x64 \ 共享
%APPDATA% \ Microsoft \ Windows \ 开始菜单 \ 程序 \ 示例 1

应用程序注册

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

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

文件 表 (部分)

文件 组件_ FileName FileSize 版本 语言 特性 序列
MyAppFile ProductComponent |PUASAMP1.EXEPUASample1.exe 81920 0 1

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

此示例定义自定义属性 RegRoot,以包含根键的位置,如果用户选择每台计算机安装,则使用自定义操作重置属性值。 在引用根位置的任何格式化字符串值中,使用自定义属性 RegRoot。 在 "属性 "表中,PUASample.msi定义自定义属性,将 RegRoot 的值设置到 HKCU。 这会初始化每用户安装上下文的 属性的值,这是建议用于双重用途包的默认上下文。

属性 表 (部分)

属性
RegRoot HKCU

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

CustomAction 表 (部分)

操作 类型 目标
设置 _ RegRoot _ HKLM 51 [RegRoot] HKLM

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

InstallExecuteSequence 表 (部分)

操作 条件 序列
设置 _ RegRoot _ HKLM ALLUSERS=1 1501

如果安装了 ProductComponent 组件,注册表表中的以下记录将执行注册。 "根"字段中的值 -1 是在"HKEY LOCAL MACHINE"下针对每用户安装执行注册,在"HKEY CURRENT USER"下针对每用户安装 _ _ _ _ 执行注册所需的。 "注册表"字段中具有空字符串的记录在 AppPaths 注册表项下添加应用程序的子项,并将" (Default) "值设置为应用程序的可执行文件的完整路径。 MyAppPathAlias 注册将可执行文件映射到应用程序别名,并使用户能够在命令行提示符下输入别名"puapct"时启动应用程序。 MyAppPathRegistration 注册将可执行文件的名称映射到文件的完整路径。

注册表 Root 名称 组件
-1 软件 \ Microsoft \ MyAppPathRegistrationLocation [RegRoot ] \ Software Microsoft Windows \ \ \ CurrentVersion \ 应用 \ 路径PUAPCT.exe ProductComponent
MyAppPathAlias -1 软件 \ Microsoft \ Windows \ CurrentVersion \ 应用 \ 路径PUAPCT.exe [#MyAppFile] ProductComponent
MyAppPathRegistration -1 软件 \ Microsoft \ Windows \ CurrentVersion \ 应用 \ 路径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 软件 \ 类 \ .pua puafile ProductComponent
MyPreviewHandlerRegistration2 -1 软件 \ Microsoft \ Windows \ \ CurrentVersion PreviewHandlers {1531d583-8375-4d3f-b5fb-d23bbd169f22} Microsoft Windows PUA TEST 预览处理程序 ProductComponent
MyPreviewHandlerRegistration3 -1 软件 \ 类 \ puafile \ ShellEx \ {8895b1c6-b41f-4c1c-a562-0d564250836f} {1531d583-8375-4d3f-b5fb-d23bbd169f22} ProductComponent
MyPreviewHandlerRegistration4 -1 软件 \ 类 \ CLSID \ {1531d583-8375-4d3f-b5fb-d23bbd169f22} Per-User应用程序示例 1 预览处理程序 ProductComponent
MyPreviewHandlerRegistration5 -1 软件 \ 类 \ CLSID \ {1531d583-8375-4d3f-b5fb-d23bbd169f22} AppID {6d2b5079-2f0b-48dd-ab7f-97cec514d30b} ProductComponent
MyPreviewHandlerRegistration6 -1 软件 \ 类 \ CLSID \ {1531d583-8375-4d3f-b5fb-d23bbd169f22} DisplayName @shell32,-38242 ProductComponent
MyPreviewHandlerRegistration7 -1 Software \ 类 \ CLSID \ {1531d583-8375-4d3f-b5fb-d23bbd169f22} 图标 notepad.exe,2 ProductComponent
MyPreviewHandlerRegistration8 -1 Software \ 类 \ CLSID \ {1531d583-8375-4d3f-b5fb-d23bbd169f22} \ InProcServer32 ThreadingModel 单元 ProductComponent
MyPreviewHandlerRegistration9 -1 Software \ 类 \ CLSID \ {1531d583-8375-4d3f-b5fb-d23bbd169f22} \ InProcServer32 #%% SystemRoot% \ system32 \shell32.dll ProductComponent
MyPreviewHandlerRegistration10 -1 Software \ 类 \ CLSID \ {1531d583-8375-4d3f-b5fb-d23bbd169f22} \ InProcServer32 ProgID puafile ProductComponent