單一套件撰寫範例

範例PUASample.msi是雙用途Windows Installer 5.0 套件的範例,可在 Windows Server 2008 R2 和 Windows 7 上的每一使用者或每部電腦安裝內容中安裝。 此範例套件遵循 單一套件撰寫中所述的開發指導方針。

取得範例的複本

此範例的複本和 Windows Installer 資料庫資料表編輯器Orca.exe位於適用于 Windows Installer 開發人員的 Windows SDK 元件中。 範例和資料表編輯器隨附 Windows Software Development Kit for Windows Server 2008 R2 和 Windows 7 作為 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 寬度 高度 屬性 標題 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 認證才能在每部電腦內容中安裝應用程式。 [控制項] 資料表的 [文字] 欄位中的值是控制項所顯示的文字樣式和文字。 如需使用預先定義樣式將文字新增至控制項的詳細資訊,請參閱 Control 資料表主題中的 Text 欄位描述。

控制 資料表 (部分)

Dialog_ 控制 類型 屬性 Text Control_Next
VerifyReadyDialog 取消 按鈕 3 {\Tahoma10} &取消 下一個
VerifyReadyDialog 上一個 按鈕 3 {\Tahoma10} <<&以前 取消
VerifyReadyDialog 下一個 按鈕 3 {\Tahoma10} &下 >> InstallPerUser
VerifyReadyDialog Text2 Text 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 時,如果使用者介面是 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

 

InstallPerUser 控制項應該從任何安裝的使用者介面中移除,該安裝使用Windows安裝程式版本早于 Windows Installer Windows Installer 5.0。 範例套件中的ControlCondition資料表包含四個專案,如果目前的版本小於 Windows Installer 5.0,則會停用並隱藏 InstallPerUser 控制項。 資料表會使用 VersionMsi 屬性的值和 條件陳述式語法 來定義此條件。 只有在 [條件] 欄位中的語句為 true 時,才會執行 [動作] 欄位中指定的動作。

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 資料表。 目錄資料表在其Directory_Parent欄位中具有空字串的記錄,代表來源和目標目錄樹狀目錄的根目錄。 如果未定義 TARGETDIR 屬性,安裝程式會在安裝時間將其值設定為 ROOTDRIVE 屬性的值。 如果未定義SourceDir屬性,安裝程式會將其值設定為包含 Windows Installer 套件 (.msi file.) 使用 short|long 格式指定目錄名稱的目錄位置。

目錄 表格 (部分)

目錄 Directory_Parent DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .
ProgramMenuFolder TARGETDIR .
INSTALLLOCATION MyVendor Sample1|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\Start Menu\Programs

 

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

%LOCALAPPDATA%\Programs\ISVnameAppName\ 。

每個使用者組態資料應該儲存在 ProgramMenuFolder 屬性的值所指定的 Programs 資料夾中。 一般而言,此資料夾位於下列路徑。

%APPDATA%\Microsoft\Windows\Start Menu\Programs

如果安裝32 位Windows安裝程式套件元件,請使用Directory資料表中的ProgramFilesFolder 和 CommonFilesFolder屬性。 如果安裝64 位Windows安裝程式套件元件,請使用ProgramFiles64Folder 和 CommonFiles64Folder屬性。 如果您的應用程式包含相同元件的 32 位和 64 位版本,則具有相同名稱,請確定這些版本會儲存在不同的目錄中,或提供不同的名稱。

下列 目錄 資料表提供與套件相容的目錄配置範例,其中包含 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 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|共用 32 位元件
Share64 Shrx64 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 資料表會解析為下列目錄路徑。 目標路徑取決於 安裝內容 和系統。

安裝內容 系統 範例路徑
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 開發人員指南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。 在 Property 資料表中,PUASample.msi封裝會定義自訂屬性,並將 RegRoot 的值設定為 HKCU。 這會初始化每一使用者安裝內容之 屬性值,這是雙重用途套件的建議預設內容。

財產 表格 (部分)

屬性
RegRoot HKCU

 

CustomAction 資料表中,套件會定義名為 Set_RegRoot_HKLM 的自訂動作。 [類型] 欄位中的值會將此值識別為 自訂動作類型 51 標準自訂動作。 CustomAction 資料表中 Source 和 Target 欄位的意義取決於自訂動作類型。 如需自訂動作標準類型的詳細資訊,請參閱 自訂動作類型。 Set_RegRoot_HKLM自訂動作的 [來源] 欄位會指定 RegRoot 屬性的值。 如果安裝程式執行Set_RegRoot_HKLM自訂動作,這會將 RegRoot 屬性的值重設為 HKLM。

CustomAction 表格 (部分)

動作 類型 來源 目標
Set_RegRoot_HKLM 51 [RegRoot] HKLM

 

最上層 的 INSTALL 巨集指令會執行 InstallExecuteSequence 資料表中該資料表中該資料表之 Sequence 欄位中所指定的動作。 (150) 1 (1501 自訂動作的 [順序] Set_RegRoot_HKLM 欄位中撰寫的值,指定在 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 登錄機碼下為應用程式新增子機碼,並將 「 (Default) 」 值設定為應用程式可執行檔的完整路徑。 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 開發人員指南之殼層擴充性一節中的準備硬體和軟體與自動播放主題。 下列記錄會在安裝 ProductComponent 元件時,註冊 [名稱] 欄位中指定的處理常式。 [根目錄] 欄位中的值 -1 必須指定給Windows安裝程式,註冊應該重新導向至相依于安裝內容的位置。

註冊 表

登錄 Root 按鍵 名稱 元件
MyAutoplayCancelRegistration -1 SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\CancelAutoplay\CLSID 66A32FE6-229D-427b-A608-D273F40C034C ProductComponent

 

預覽處理常式註冊

PUASample.msi會執行安裝 預覽處理常式 所需的註冊,以啟用 .pua 檔案的唯讀預覽,而不需要啟動應用程式。 For information about registering preview handlers, see the Registering Preview Handlers topic in the shell extensibility section of the Shell Developer's Guide. 下列 登錄資料表中的 記錄會在安裝 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 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} Per-User應用程式範例 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