共用方式為


單一套件撰寫範例

範例 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 原則未設定為封鎖應用程式安裝的值。

識別一個 Dual-Purpose 套件

雙用途套件應將 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 寬度 高度 屬性 標題 控制_第一 控制_預設 控制_取消
VerifyReadyDialog 50 50 480 280 39 [ProductName] InstallPerUser 下一步 取消

 

Control 資料表中包含 [VerifyReadyDialog 對話框] 所顯示的 控件 的專案。 對話框會顯示 PushButton 控件和 文字 控件。 所有控件都會使用 msidbControlAttributesEnabled (2) 和 msidbControlAttributesVisible (1) 控件屬性。 InstallPerMachine 控制項也會使用 ElevationShield 控制項屬性 msidbControlAttributesElevationShield (8388608.)此控制項屬性會將 用戶帳戶控制 (UAC)提升權限圖示(盾牌圖示)新增至 InstallPerMachine 控制項,並通知用戶必須以每部機器的層級安裝應用程式時需要 UAC 認證。 [控件] 資料表的 [文字] 字段中的值是控件所顯示的文字樣式和文字。 如需使用預先定義樣式將文字新增至控件的詳細資訊,請參閱 Control 數據表主題中的 Text 字段描述。

控制項 表格 (部分)

對話_ 控制 類型 屬性 文字 Control_Next
VerifyReadyDialog 取消 按鈕 3 {\Tahoma10}&取消 下一步
VerifyReadyDialog 以前 按鈕 (PushButton) 3 {\Tahoma10}<<&上一個 取消
VerifyReadyDialog 下一個 按鈕 3 {\Tahoma10}&下一個 >> InstallPerUser
驗證就緒對話框 Text2 文字 3 您是否已準備好完成暫停的安裝?
VerifyReadyDialog InstallPerUser 按鈕 3 {\Tahoma10}僅針對 &我安裝 InstallPerMachine
VerifyReadyDialog InstallPerMachine 推按鈕 8388611 {\Tahoma10}為所有人安裝 & 以前
VerifyReadyDialog 取消 按鈕 3 {\Tahoma10}&取消 下一步

 

ControlEvent 表格會指定 ControlEvents或動作,安裝程式會在使用者與控制項互動時執行。 當使用者啟動 InstallPerUser 按鈕時,如果 OutOfDiskSpace 屬性為 1,使用者介面會顯示 OutOfDisk 對話框,並將 MSIINSTALLPERUSER 屬性設為 1,將 ALLUSERS 屬性設為 2,將 MSIFASTINSTALL 屬性設為 1,然後返回。 因為 MSIFASTINSTALL 屬性已設定,因此不會為安裝產生任何系統還原點。 當使用者啟動 InstallPerMachine pushbutton 時,如果使用者介面的 OutOfDiskSpace 屬性為 1,則會顯示 OutOfDisk 對話框,將 ALLUSERS 屬性設定為 1,然後返回。

ControlEvent 數據表 (部分)

對話_ 控制_ 事件 論點 條件 訂單
VerifyReadyDialog InstallPerUser SpawnDialog OutOfDisk OutOfDiskSpace = 1 1
VerifyReadyDialog InstallPerUser 結束對話 返回 OutOfDiskSpace <> 1 5
VerifyReadyDialog InstallPerUser [MSIINSTALLPERUSER] 1 1 2
VerifyReadyDialog InstallPerUser [ALLUSERS] 2 1 3
VerifyReadyDialog InstallPerMachine SpawnDialog OutOfDisk OutOfDiskSpace = 1 1
VerifyReadyDialog InstallPerMachine 結束對話框 返回 OutOfDiskSpace <> 1 3
VerifyReadyDialog InstallPerMachine [ALLUSERS] 1 1 2
VerifyReadyDialog InstallPerUser [MSIFASTINSTALL] 1 1 4

 

使用 Windows Installer 5.0 之前的版本時,應從所有安裝程序的使用者介面中移除 InstallPerUser 控制項。 範例套件中的 ControlCondition 數據表包含四個項目,這些項目會在目前版本小於 Windows Installer 5.0 時停用並隱藏 InstallPerUser 控制元件。 數據表會使用 VersionMsi 屬性的值,以及 條件語句語法 來定義此條件。 只有在 [條件] 欄位中的語句為 true 時,才會執行 [動作] 字段中指定的動作。

ControlCondition Table (部分)

對話框_ 控制_ 行動 條件
驗證就緒對話框 InstallPerUser 啟用 VersionMsi >= “5.00”
VerifyReadyDialog InstallPerUser 禁用 VersionMsi < “5.00”
VerifyReadyDialog InstallPerUser 顯示 VersionMsi >= “5.00”
VerifyReadyDialog InstallPerUser 隱藏 VersionMsi < “5.00”

 

指定目錄結構

使用資料庫編輯器來檢查 PUASample1.msiDirectory 數據表。 目錄數據表在其Directory_Parent欄位中有空字串的記錄,代表來源和目標目錄樹狀目錄的根目錄。 如果未定義 TARGETDIR 屬性,安裝程式會在安裝時間將其值設定為 ROOTDRIVE屬性的值。 如果未定義 SourceDir 屬性,安裝程式會將其值設定為包含 Windows Installer 套件的目錄位置(.msi 檔案)。目錄名稱是使用 short|long 格式來指定。

目錄 資料表 (部分)

目錄 目錄_父項 DefaultDir
TARGETDIR SourceDir
程式檔案資料夾 TARGETDIR .
程式功能表資料夾 TARGETDIR .
安裝位置 MyVendor Sample1|MSDN-PUASample1
MyVendor 程式檔案資料夾 Msft|微軟

 

在源頭,這個 Directory 表格解析為下列目錄路徑。

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

在目標中,目錄 資料表解析為下表中的路徑。 安裝程式會將 ProgramFilesFolderProgramMenuFolder 屬性的值,設定為相依於 安裝內容 的位置,及系統是否為 32 位或 64 位版本的 Windows Server 2008 R2 和 Windows 7。 目標資料夾的路徑取決於用戶選取的是針對使用者的安裝類型還是針對機器的安裝類型。

安裝背景 系統 範例路徑
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\Local\Programs\Msft\Sample1
%APPDATA%\Microsoft\Windows\開始功能表\程式

 

個別使用者的應用程式應儲存在「Programs」資料夾下的子資料夾中,這是由 ProgramFilesFolder 屬性的值所指定。 一般而言,應用程式的路徑會採用下列格式。

%LOCALAPPDATA%\Programs\ISV name\AppName

個別使用者組態數據應該儲存在 ProgramMenuFolder 屬性值所指定的 Programs 資料夾中。 此資料夾通常位於下列路徑。

%APPDATA%\Microsoft\Windows\開始功能表\程式

如果安裝 32 位 Windows Installer 套件 元件,請使用 Directory 數據表中的 ProgramFilesFolderCommonFilesFolder 属性。 如果安裝 64 位 Windows Installer 套件 元件,請使用 ProgramFiles64FolderCommonFiles64Folder 属性。 如果您的應用程式包含相同元件的32位和64位版本,則使用相同的名稱,請確定這些版本會儲存在不同的目錄中,或提供不同的名稱。

下列 Directory 數據表提供與套件相容的目錄配置範例,其中包含 32 位和 64 位元件,並包含跨應用程式共用的一些元件。

目錄 目錄_父 DefaultDir
TARGETDIR SourceDir
程式檔案資料夾 TARGETDIR .:Prog32
ProgramFiles64Folder TARGETDIR .:Prog64
常用檔案資料夾 TARGETDIR .:Share32
CommonFiles64Folder TARGETDIR .:Share64
程式選單資料夾 TARGETDIR .:Sample1|MSDN-PUASample1
安裝位置 MyVendor Sample1|MSDN-PUASample1
安裝位置X64 Vendorx64 Sample1|MSDN-PUASample1
共享位置 ShVendor Sample1|MSDN-PUASample1
SHAREDLOCATIONX64 ShVendorx64 Sample1|MSDN-PUASample1
MyVendor 程式檔案資料夾 Msft|Microsoft
Vendorx64 ProgramFiles64Folder Msft|微軟
ShVendor 共用檔案資料夾 微軟(Msft|Microsoft)
ShVendorx64 CommonFiles64Folder Msft|Microsoft
Shrx86 共享位置 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\]Sample1

在目標端,此 Directory 數據表會解析為下列目錄路徑。 目標路徑取決於 安裝內容 和系統。

安裝背景 系統 範例路徑
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\Start 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\Start 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\Start Menu\Programs\Sample1

 

應用程式註冊

PUASample.msi 會將子機碼新增至應用程式的 [應用程式路徑] 登錄機碼,並執行註冊,讓應用程式資訊儲存在此機碼下的登錄中。 如需應用程式路徑和應用程式註冊的詳細資訊,請參閱 Shell 開發人員指南殼層擴充性 一節中的 PerceivedTypes、SystemFileAssociations 和應用程式註冊。 在安裝時,用戶可以選擇在單一使用者或者整部計算機的安裝環境中安裝應用程式。 在撰寫雙重用途套件時,套件開發人員無法知道是否應在HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER密鑰下執行註冊。

套件開發人員會在 [檔案] [數據表] 的 [檔案] 欄位中,定義應用程式可執行檔案的檔案識別碼。

檔案 資料表 (部分)

元件_ 檔名 檔案大小 版本 語言 屬性 序列
MyAppFile 產品元件 PUASAMP1.EXE|PUASample1.exe 81920 0 1

 

在 [登錄] 表的 [值] 字段中,可以指定要儲存在登錄中的值,這些值以 格式 字串的形式表示。 使用 檔案 資料表之 [檔案] 欄位中定義的檔案識別碼,以及 [#filekey] 格式類型的慣例,以指定應用程式路徑登錄機碼的預設值。 最上層 INSTALL 動作會在 InstallExecuteSequence 數據表中執行動作。 在表中的動作 CostInitializeFileCostInstallFinalize 完成後,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 表格 (部分)

行動 類型 目標
Set_RegRoot_HKLM 51 [RegRoot] HKLM

 

最上層 INSTALL 動作會依照該數據表的 Sequence 欄位中指定的順序,執行 InstallExecuteSequence 數據表中的動作。 在 Set_RegRoot_HKLM 自定義動作的 [序列] 欄位中撰寫的值(1501)指定該自定義動作在 InstallInitialize 動作(1500)之後,以及在 ProcessComponents 動作(1600)之前執行。此順序確保 Set_RegRoot_HKLM 自定義動作的記錄在安裝時被評估。 如需 InstallExecuteSequence 數據表中建議動作順序的詳細資訊,請參閱 建議的 InstallExecuteSequence 主題。 在 [條件] 欄位中撰寫的 條件語句語法,指定 Set_RegRoot_HKLM 動作只有在安裝時 ALLUSERS 屬性值評估為 1 時才會執行。 ALLUSERS 屬性值為 1 指定每部電腦的安裝。

InstallExecuteSequence 表格 (部分)

行動 條件 序列
Set_RegRoot_HKLM ALLUSERS=1 1501

 

如果已安裝 ProductComponent 元件,登錄 數據表中的下列記錄會執行註冊。 Root 欄位中的值 -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 產品元件
MyAppPathAlias -1 軟體\Microsoft\Windows\CurrentVersion\App Paths\PUAPCT.exe [#MyAppFile] 產品元件
MyAppPathRegistration -1 軟體\Microsoft\Windows\CurrentVersion\App Paths\PUASample1.exe [#MyAppFile] 產品組件

 

自動播放取消註冊

PUASample.msi 會執行註冊,讓應用程式使用者無法針對選取的裝置啟動 硬體自動執行。 如需註冊處理程式以取消自動播放以回應事件的相關信息,請參閱 Shell 開發人員指南殼層擴充性 一節中的準備硬體和軟體與自動播放 主題。 下列記錄會在安裝 ProductComponent 元件時,註冊 [名稱] 欄位中指定的處理程式。 根欄位中的值 -1 必須向 Windows Installer 指定,將註冊重新導向至視安裝內容而定的位置。

註冊 資料表

登記簿 鑰匙 名字 價值 元件
我的自動播放取消註冊 -1 SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\CancelAutoplay\CLSID 66A32FE6-229D-427b-A608-D273F40C034C 產品元件

 

預覽處理程序註冊

PUASample.msi 會執行安裝 預覽處理程式所需的註冊, 啟用 .pua 檔案的只讀預覽,而不需要啟動應用程式。 如需註冊預覽處理程式的詳細資訊,請參閱 Shell 開發人員指南殼層擴充性 一節中的 註冊預覽處理程式 主題。 安裝 ProductComponent 元件時,Registry 數據表中的下列記錄會註冊處理程式。 在 [根] 欄位中,必須將值 -1 指定給 Windows Installer,指示安裝程式將註冊重新導向到依據安裝情境特定的位置。

註冊表

註冊表 鑰匙 名字 價值 元件
MyPreviewHandlerRegistration1 -1 Software\Classes\.pua puafile 產品組件
MyPreviewHandlerRegistration2 -1 Software\Microsoft\Windows\CurrentVersion\PreviewHandlers {1531d583-8375-4d3f-b5fb-d23bbd169f22} Microsoft Windows PUA TEST Preview 處理程式 產品元件
MyPreviewHandlerRegistration3 -1 Software\Classes\puafile\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f} {1531d583-8375-4d3f-b5fb-d23bbd169f22} 產品組件
MyPreviewHandlerRegistration4 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} Per-User 應用程式範例 1 預覽處理程式 產品元件
MyPreviewHandlerRegistration5 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} AppID {6d2b5079-2f0b-48dd-ab7f-97cec514d30b} 產品元件
MyPreviewHandlerRegistration6 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} 顯示名稱 @shell32,-38242 產品組件
MyPreviewHandlerRegistration7 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} 圖示 notepad.exe,2 產品元件
MyPreviewHandlerRegistration8 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 ThreadingModel 公寓 產品組件
MyPreviewHandlerRegistration9 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 #%%SystemRoot%\system32\shell32.dll 產品組件
MyPreviewHandlerRegistration10 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 ProgID puafile 產品元件