單一套件撰寫範例
範例 PUASample.msi 是雙用途 Windows Installer 5.0 套件的範例,可在 Windows Server 2008 R2 和 Windows 7 上的每個使用者或每部計算機 安裝內容 中安裝。 此範例套件遵循單一套件撰寫中所述的開發指導方針。
取得範例複本
此範例的復本和 Windows Installer 資料庫數據表編輯器 Orca.exe 位於適用於 Windows Installer 開發人員的 Windows SDK 元件中。 範例和數據表編輯器隨附 Windows Server 2008 R2 和 Windows 7 的 Windows 軟體開發工具包,作為 Windows Installer 安裝檔案 PUASample1.msi 和 Orca.msi。
系統需求
資料庫編輯器 Orca.exe 需要 Windows Server 2008 R2 和更早版本和 Windows 7 和更早版本。 雙用途套件 PUASample1.msi 可以安裝在 Windows Server 2008 R2 和 Windows 7 上的每部電腦或每個使用者 安裝內容 中。 PUASample1.msi 只能安裝在 Windows Server 2008 和更早版本和 Windows Vista 和更早版本的每部機器內容中。 您可以安裝資料庫編輯器來檢查 PUASample1.msi 的內容,而不需安裝範例。 若要安裝範例或編輯器套件,請確定 DisableMSI 原則未設定為封鎖應用程式安裝的值。
識別雙重用途套件
雙用途套件應將 MSIINSTALLPERUSER 屬性的值初始化為 1。 這會將套件識別為能夠在 Windows Server 2008 R2 和 Windows 7 上的每部電腦或每個使用者內容中安裝。 只有在已遵循單一套件撰寫中所述的開發指導方針,以及您想要為使用者提供在每個使用者或每部計算機內容中安裝套件的選項時,才在套件中設定 MSIINSTALLPERUSER 屬性。 雙重用途套件也應該將 ALLUSERS 屬性的值初始化為 2。 這會指定個別使用者作為應用程式的預設安裝內容。 如果 ALLUSERS 屬性的值是 2 以外的任何值,Windows Installer 會忽略 MSIINSTALLPERUSER 屬性。
使用 Windows Installer 資料庫編輯器,例如 Orca.exe,來檢查 PUASample1.msi 的內容。 範例套件中的 Property 數據表包含下列兩個專案。
屬性 表 (部分)
屬性 | 值 |
---|---|
ALLUSERS | 2 |
MSIINSTALLPERUSER | 1 |
安裝內容的自定義對話框
範例 套件的使用者介面 包含自定義對話框 VerifyReadyDialog 的範例,可讓使用者在安裝時選取每個使用者或每部計算機安裝內容。 Dialog 數據表包含描述 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 | 下一步 | 取消 |
[控件] 數據表包含 VerifyReadyDialog 對話框所顯示之控件的專案。 對話框會顯示 PushButton 控件和 文字 控制件。 所有控件都會使用 msidbControlAttributesEnabled (2) 和 msidbControlAttributesVisible (1) 控件屬性。 InstallPerMachine 控件也會使用 ElevationShield 控件屬性 msidbControlAttributesElevationShield (8388608.)此控件屬性會將 用戶帳戶控制 (UAC) 提高許可權圖示 (盾牌圖示) 新增至 InstallPerMachine 控件,並通知用戶必須在每部計算機內容中安裝應用程式所需的 UAC 認證。 [控件] 資料表的 [文字] 字段中的值是控件所顯示的文字樣式和文字。 如需使用預先定義樣式將文字新增至控件的詳細資訊,請參閱 Control 數據表主題中的 Text 字段描述。
控制 表 (部分)
對話 框_ | 控制 | 類型 | 屬性 | Text | Control_Next |
---|---|---|---|---|---|
VerifyReadyDialog | 取消 | 按鈕 | 3 | {\Tahoma10}&Cancel | 下一步 |
VerifyReadyDialog | 上一筆 | 按鈕 | 3 | {\Tahoma10}<<&Previous | 取消 |
VerifyReadyDialog | 下一步 | 按鈕 | 3 | {\Tahoma10}&Next >> | InstallPerUser |
VerifyReadyDialog | Text2 | Text | 3 | 您是否已準備好完成暫停的安裝? | |
VerifyReadyDialog | InstallPerUser | 按鈕 | 3 | {\Tahoma10}僅針對 &Me 安裝 | InstallPerMachine |
VerifyReadyDialog | InstallPerMachine | 按鈕 | 8388611 | {\Tahoma10}安裝 for &Everyone | 上一筆 |
VerifyReadyDialog | 取消 | 按鈕 | 3 | {\Tahoma10}&Cancel | 下一步 |
ControlEvent 數據表會指定 ControlEvents 或動作,安裝程式會在使用者與控件互動時執行。 當使用者啟動 InstallPerUser pushbutton 時,如果使用者介面顯示 OutOfDisk 對話方塊,如果 OutOfDiskSpace 屬性為 1,請將 MSIINSTALLPERUSER 屬性的值設定為 1、將 ALLUSERS 屬性的值設定為 2、將 MSIFASTINSTALL 屬性設定為 1,並傳回 。 因為已設定 MSIFASTINSTALL 屬性,因此不會為安裝產生任何系統還原點。 當使用者啟動 InstallPerMachine pushbutton 時,如果使用者介面的 OutOfDiskSpace 屬性為 1,則會顯示 OutOfDisk 對話框、將 ALLUSERS 屬性的值設定為 1,並傳回 。
ControlEvent 數據表 (部分)
對話 框_ | 控制_ | Event | Argument | Condition | 訂單 |
---|---|---|---|---|---|
VerifyReadyDialog | InstallPerUser | SpawnDialog | OutOfDisk | OutOfDiskSpace = 1 | 1 |
VerifyReadyDialog | InstallPerUser | EndDialog | 傳回 | OutOfDiskSpace <> 1 | 5 |
VerifyReadyDialog | InstallPerUser | [MSIINSTALLPERUSER] | 1 | 7 | 2 |
VerifyReadyDialog | InstallPerUser | [ALLUSERS] | 2 | 1 | 3 |
VerifyReadyDialog | InstallPerMachine | SpawnDialog | OutOfDisk | OutOfDiskSpace = 1 | 1 |
VerifyReadyDialog | InstallPerMachine | EndDialog | 傳回 | OutOfDiskSpace <> 1 | 3 |
VerifyReadyDialog | InstallPerMachine | [ALLUSERS] | 1 | 7 | 2 |
VerifyReadyDialog | InstallPerUser | [MSIFASTINSTALL] | 1 | 1 | 4 |
使用 Windows Installer Windows Installer 5.0 之前的 Windows Installer 版本,應該從任何安裝的使用者介面中移除 InstallPerUser 控件。 範例套件中的 ControlCondition 數據表包含四個專案,如果目前的版本小於 Windows Installer 5.0,則會停用並隱藏 InstallPerUser 控件。 數據表會使用 VersionMsi 屬性的值和條件語句語法來定義此條件。 只有在 [條件] 欄位中的語句為 true 時,才會執行 [動作] 字段中指定的動作。
ControlCondition 表格 (部分)
對話 框_ | 控制_ | 動作 | Condition |
---|---|---|---|
VerifyReadyDialog | InstallPerUser | Enable | 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 檔案) 的目錄位置。目錄名稱是使用 short|long 格式來指定。
目錄 資料表 (部分)
Directory | Directory_Parent | DefaultDir |
---|---|---|
TARGETDIR | SourceDir | |
ProgramFilesFolder | TARGETDIR | . |
ProgramMenuFolder | TARGETDIR | . |
INSTALLLOCATION | MyVendor | Sample1|MSDN-PUASample1 |
MyVendor | ProgramFilesFolder | Msft|微軟 |
在來源,此 Directory 數據表會解析為下列目錄路徑。
- \[SourceDir\]\\Msft\\Sample1 \[SourceDir\]
在目標上 ,Directory 數據表會解析為下表中的路徑。 安裝程式會將 ProgramFilesFolder 和 ProgramMenuFolder 屬性的值設定為相依於安裝內容的位置,以及系統是否為 32 位或 64 位版本的 Windows Server 2008 R2 和 Windows 7。 目標資料夾的路徑取決於用戶選取每個使用者或每部電腦安裝。
安裝內容 | 系統 | 範例路徑 |
---|---|---|
每部電腦 | Windows Server 2008 R2 與 Windows 7 32 位版本 |
%ProgramFiles%\Msft\Sample1 %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs |
每部電腦 | Windows Server 2008 R2 與 Windows 7 64 位版本 |
%ProgramFiles(x86)%\Msft\Sample1 %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs |
每位使用者 | Windows Server 2008 R2 與 Windows 7 32 位或64位版本 |
%USERPROFILE%\AppData\Local\Programs\Msft\Sample1 %APPDATA%\Microsoft\Windows\Start Menu\Programs |
個別使用者應用程式應該儲存在 ProgramFilesFolder 屬性值所指定之 Programs 資料夾下的子資料夾中。 一般而言,應用程式的路徑會採用下列格式。
%LOCALAPPDATA%\Programs\ISV name\AppName。
個別使用者組態數據應該儲存在 ProgramMenuFolder 屬性值所指定的 Programs 資料夾中。 此資料夾通常位於下列路徑。
%APPDATA%\Microsoft\Windows\Start Menu\Programs
如果安裝 32 位 Windows Installer 套件元件,請使用 Directory 數據表中的 ProgramFilesFolder 和 CommonFilesFolder 屬性。 如果安裝 64 位 Windows Installer 套件元件,請使用 ProgramFiles64Folder 和 CommonFiles64Folder 属性。 如果您的應用程式包含相同元件的32位和64位版本,則使用相同的名稱,請確定這些版本會儲存在不同的目錄中,或提供不同的名稱。
下表提供與套件相容的目錄配置範例,其中包含32位和64位元件,並包含跨應用程式共用的一些元件。
Directory | 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 | Sample1|MSDN-PUASample1 |
INSTALLLOCATIONX64 | Vendorx64 | Sample1|MSDN-PUASample1 |
SHAREDLOCATION | ShVendor | Sample1|MSDN-PUASample1 |
SHAREDLOCATIONX64 | ShVendorx64 | Sample1|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 | shared|shared 32 位元件 |
Share64 | Shrx64 | shared|shared 64 位元件 |
在來源,此 Directory 數據表會解析為下列目錄路徑。
- \[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
在目標上,此 Directory 數據表會解析為下列目錄路徑。 目標路徑取決於 安裝內容 和系統。
安裝內容 | 系統 | 範例路徑 |
---|---|---|
每部電腦 | 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\Start Menu\Programs\Sample1 |
每部電腦 | 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\Start Menu\Programs\Sample1 |
每位使用者 | 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\Start Menu\Programs\Sample1 |
應用程式註冊
PUASample.msi 會將子機碼新增至應用程式的 [應用程式路徑] 登錄機碼,並執行註冊,讓應用程式資訊能夠儲存在此機碼下的登錄中。 如需應用程式路徑和應用程式註冊的詳細資訊,請參閱Shell開發人員指南的殼層擴充性一節中的PerceivedTypes、SystemFileAssociations和應用程式註冊。 在安裝期間,用戶決定在每一使用者或每部計算機安裝內容中安裝應用程式。 在撰寫雙重用途套件時,套件開發人員無法知道是否應在HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER密鑰下執行註冊。
套件開發人員會在 [檔案數據表] 的 [檔案] 字段中,定義應用程式可執行檔的檔案識別碼。
檔案 表格 (部分)
檔案 | 元件_ | FileName | FileSize | 版本 | 語言 | 屬性 | 序列 |
---|---|---|---|---|---|---|---|
MyAppFile | ProductComponent | PUASAMP1.EXE|PUASample1.exe | 81920 | 0 | 1 |
在登錄數據表的 [值] 字段中,可以指定要儲存在登錄中的值,做為格式化字串。 使用 [檔案] 數據表之 [檔案 ] 字段中定義的檔案標識符,以及 [格式類型] 的 [#filekey] 慣例,來指定應用程式路徑登錄機碼的預設值。 最上層的 INSTALL 動作會執行 InstallExecuteSequence 數據表中的動作。 在此數據表中完成 CostInitialize、FileCost 和 InstallFinalize 動作之後,Windows Installer 會將登錄數據表中格式化的子字串 [#MyAppFile] 取代為應用程式檔的完整路徑。
此範例會定義自定義屬性 RegRoot,以包含根密鑰的位置,並在使用者選擇每部電腦安裝時使用自定義動作來重設屬性值。 在參考根位置的任何格式化字串值中使用自定義屬性 RegRoot。 在 Property 資料表中,PUASample.msi 套件會定義自定義屬性,並將 RegRoot 的值設定為 HKCU。 這會初始化個別使用者安裝內容之 屬性的值,這是雙用途套件的建議預設內容。
屬性 表 (部分)
屬性 | 值 |
---|---|
RegRoot | HKCU |
在 CustomAction 數據表中,封裝會定義名為 Set_RegRoot_HKLM 的自定義動作。 [類型] 欄位中的值會將此值識別為 自定義動作類型 51 標準自定義動作。 CustomAction 數據表中 [來源] 和 [目標] 字段的意義取決於自定義動作類型。 如需自定義動作標準類型的詳細資訊,請參閱 自定義動作類型。 Set_RegRoot_HKLM自定義動作的 [來源] 字段會指定 RegRoot 屬性的值。 如果安裝程式執行Set_RegRoot_HKLM自定義動作,這會將 RegRoot 屬性的值重設為 HKLM。
CustomAction 表格 (部分)
動作 | 類型 | 來源 | Target |
---|---|---|---|
Set_RegRoot_HKLM | 51 | [RegRoot] | HKLM |
最上層的 INSTALL 動作會在 InstallExecuteSequence 數據表中,在該數據表的 [順序] 字段中指定的順序中執行動作。 在Set_RegRoot_HKLM自定義動作 (1501) 的 [時序] 字段中撰寫的值會指定在 InstallInitialize 宏指令 (1500) 和 ProcessComponents 宏指令之前執行這個自定義動作 (1600.此順序可確保在安裝時間評估Set_RegRoot_HKLM自定義動作的記錄。 如需 InstallExecuteSequence 數據表中建議動作順序的詳細資訊,請參閱 建議的 InstallExecuteSequence 主題。 在 [條件] 欄位中撰寫的條件語句語法會指定只有在安裝時間 ALLUSERS 屬性值評估為 1 時,才會執行Set_RegRoot_HKLM動作。 ALLUSERS 屬性值為 1 會指定每部電腦的安裝。
InstallExecuteSequence Table (partial)
動作 | Condition | 序列 |
---|---|---|
Set_RegRoot_HKLM | ALLUSERS=1 | 1501 |
如果已安裝 ProductComponent 元件,登錄數據表中的下列記錄會執行註冊。 [根] 欄位中的值 -1 必須針對每個使用者安裝執行HKEY_LOCAL_MACHINE下的註冊,以及在個別使用者安裝HKEY_CURRENT_USER下執行註冊。 登錄欄位中具有空字串的記錄會在 AppPaths 登錄機碼下新增應用程式的子機碼,並將 「(Default)」 值設定為應用程式可執行檔的完整路徑。 MyAppPathAlias 註冊會將可執行檔對應至應用程式別名,而且如果使用者在命令行提示字元中輸入別名 “puapct”,就可以啟動應用程式。 MyAppPathRegistration 註冊會將可執行檔的名稱對應至檔案的完整路徑。
登錄 | 根目錄 | 索引鍵 | 名稱 | 值 | 元件 |
---|---|---|---|---|---|
-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開發人員指南殼層擴充性一節中的準備硬體和軟體與自動播放搭配使用主題。 下列記錄會在安裝 ProductComponent 元件時,註冊 [名稱] 欄位中指定的處理程式。 [根] 欄位中的值 -1 必須指定給 Windows Installer,註冊應該重新導向至相依於安裝內容的位置。
登錄 表
登錄 | 根目錄 | 索引鍵 | 名稱 | 值 | 元件 |
---|---|---|---|---|---|
MyAutoplayCancelRegistration | -1 | SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\CancelAutoplay\CLSID | 66A32FE6-229D-427b-A608-D273F40C034C | ProductComponent |
預覽處理程序註冊
PUASample.msi 會執行安裝 預覽處理程式 所需的註冊,以啟用 .pua 檔案的只讀預覽,而不需要啟動應用程式。 如需註冊預覽處理程式的相關信息,請參閱Shell開發人員指南之殼層擴充性一節中的註冊預覽處理程式主題。 登錄數據表中的下列記錄會在安裝 ProductComponent 元件時註冊處理程式。 [根] 欄位中的值 -1 必須指定給 Windows Installer,註冊應該重新導向至相依於安裝內容的位置。
登錄 表
登錄 | 根目錄 | 索引鍵 | 名稱 | 值 | 元件 |
---|---|---|---|---|---|
MyPreviewHandlerRegistration1 | -1 | Software\Classes\.pua | puafile | ProductComponent | |
MyPreviewHandlerRegistration2 | -1 | Software\Microsoft\Windows\CurrentVersion\PreviewHandlers | {1531d583-8375-4d3f-b5fb-d23bbd169f22} | Microsoft Windows PUA TEST Preview 處理程式 | 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} | 個別使用者應用程式範例 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} | Icon | 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 |