単一パッケージの作成例

サンプルの PUASample.msi は、二重目的の Windows インストーラー 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 にマシン単位またはユーザー単位のインストール コンテキストでインストールできます。 PUASample1.msi は、Windows Server 2008 以前および Windows Vista 以前のマシン単位のコンテキストにのみインストールできます。 データベース エディターをインストールして、サンプルをインストールせずに PUASample1.msi の内容を確認できます。 サンプルやエディターのパッケージをインストールするには、DisableMSI ポリシーがアプリケーションのインストールをブロックする値に設定されていないことを確認してください。

二重目的パッケージの識別

二重目的パッケージでは、MSIINSTALLPERUSER プロパティの値を 1 に初期化する必要があります。 これにより、Windows Server 2008 R2 および Windows 7 上のマシン単位またはユーザー単位のコンテキストにインストール可能としてパッケージが識別されます。 パッケージの MSIINSTALLPERUSER プロパティを設定するのは、「単一パッケージの作成」に記載されている開発ガイドラインに従ってこれが記述されている場合、およびユーザー単位またはマシン単位のコンテキストにパッケージをインストールするオプションをユーザーに提供する予定である場合のみです。 二重目的パッケージでは、ALLUSERS プロパティの値を 2 に初期化する必要もあります。 これにより、アプリケーションの既定のインストール コンテキストとしてユーザー単位が指定されます。 ALLUSERS プロパティの値が 2 以外の値の場合、Windows インストーラーは MSIINSTALLPERUSER プロパティを無視します。

Orca.exe などの Windows インストーラー データベース エディターを使用して、PUASample1.msi の内容を調べます。 サンプル パッケージの Property テーブルには、次の 2 つのエントリが含まれています。

Property テーブル (一部)

プロパティ
ALLUSERS 2
MSIINSTALLPERUSER 1

 

インストール コンテキスト用のカスタム ダイアログ ボックス

サンプル パッケージのユーザー インターフェイスには、ユーザーがインストール時にユーザー単位またはマシン単位のインストール コンテキストを選択できるようにするカスタム ダイアログ ボックス、VerifyReadyDialog の例が含まれています。 Dialog テーブルには、VerifyReadyDialog ダイアログ ボックスを記述するレコードが含まれています。 このダイアログ ボックスでは msidbDialogAttributesVisible (1)、msidbDialogAttributesModal (2)、msidbDialogAttributesMinimize (4)、msidbDialogAttributesTrackDiskSpace (32) のダイアログ スタイル ビットが使用されるため、Attributes フィールドに入力されている値は 39 です。 ダイアログ ボックスのタイトル バーには、ProductName プロパティの値によって指定されたタイトルが表示されます。

Dialog テーブル (一部)

ダイアログ HCentering VCentering [高さ] 属性 Title Control_First Control_Default Control_Cancel
VerifyReadyDialog 50 50 480 280 39 [ProductName] InstallPerUser 次へ キャンセル

 

Control テーブルには、VerifyReadyDialog ダイアログ ボックスに表示されるコントロールのエントリが含まれています。 ダイアログ ボックスには、複数の PushButton コントロールと 1 つの Text コントロールが表示されます。 すべてのコントロールは、msidbControlAttributesEnabled (2) および msidbControlAttributesVisible (1) コントロール属性を使用します。 InstallPerMachine コントロールでは、ElevationShield コントロール属性、msidbControlAttributesElevationShield (8388608) も使用されます。このコントロール属性により、"ユーザー アカウント制御" (UAC) 昇格アイコン (盾アイコン) が InstallPerMachine コントロールに追加され、マシン単位のコンテキストにアプリケーションをインストールするために UAC 資格情報が必要であることがユーザーに通知されます。 Control テーブルの Text フィールドの値は、コントロールによって表示されるテキスト スタイルとテキストです。 事前定義済みのスタイルを使用してテキストをコントロールに追加する方法の詳細については、「Control テーブル」トピックの Text フィールドの説明を参照してください。

Control テーブル (一部)

Dialog_ コントロール Type 属性 Text Control_Next
VerifyReadyDialog キャンセル PushButton 3 {\Tahoma10}&Cancel 次へ
VerifyReadyDialog 前へ PushButton 3 {\Tahoma10}<<&Previous キャンセル
VerifyReadyDialog 次へ PushButton 3 {\Tahoma10}&Next >> InstallPerUser
VerifyReadyDialog Text2 テキスト 3 Are you ready to complete your suspended installation?
VerifyReadyDialog InstallPerUser PushButton 3 {\Tahoma10}Install Only for &Me InstallPerMachine
VerifyReadyDialog InstallPerMachine PushButton 8388611 {\Tahoma10}Install for &Everyone 前へ
VerifyReadyDialog キャンセル PushButton 3 {\Tahoma10}&Cancel 次へ

 

ControlEvent テーブルでは、ユーザーがコントロールを操作するときにインストーラーによって実行される ControlEvents (アクション) を指定します。 ユーザーが InstallPerUser プッシュ ボタンをアクティブにすると、OutOfDiskSpace プロパティが 1 である場合、ユーザー インターフェイスに [OutOfDisk ] ダイアログ ボックスが表示され、MSIINSTALLPERUSER プロパティの値が 1 に設定され、ALLUSERS プロパティの値が 2 に設定され、MSIFASTINSTALL プロパティが 1 に設定されて、戻ります。 MSIFASTINSTALL プロパティが設定されているため、インストールに対してシステム復元ポイントは生成されません。 ユーザーが InstallPerMachine プッシュ ボタンをアクティブにすると、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

 

InstallPerUser コントロールは、Windows インストーラー 5.0 より前のバージョンの Windows インストーラーを使用するインストールのユーザー インターフェイスから削除される必要があります。 サンプル パッケージの ControlCondition テーブルには、現在のバージョンが Windows インストーラー 5.0 未満である場合に InstallPerUser コントロールを無効および非表示にする 4 つのエントリが含まれています。 この条件を定義するために、テーブルでは VersionMsi プロパティの値と 条件付きステートメントの構文 を使用しています。 Action フィールドに指定されたアクションは、Condition フィールドのステートメントが 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 フィールドに空の文字列がある Directory テーブルのレコードは、ソースとターゲットの両方のディレクトリ ツリーのルート ディレクトリを表します。 TARGETDIR プロパティが未定義の場合、インストーラーはインストール時にその値を ROOTDRIVE プロパティの値に設定します。 SourceDir プロパティが未定義の場合、インストーラーは、その値を Windows インストーラー パッケージ (.msi ファイル) を含むディレクトリの場所に設定します。ディレクトリ名は、"短い|長い" 形式を使用して指定します。

Directory テーブル (一部)

ディレクトリ Directory_Parent DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .
ProgramMenuFolder TARGETDIR .
INSTALLLOCATION MyVendor Sample1|MSDN-PUASample1
MyVendor ProgramFilesFolder Msft|Microsoft

 

ソースでは、この Directory テーブルは次のディレクトリ パスに解決されます。

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

ターゲットでは、Directory テーブルは次の表のパスに解決されます。 インストーラーは、ProgramFilesFolder および ProgramMenuFolder プロパティの値を、インストール コンテキストによって、さらにシステムが Windows Server 2008 R2 および Windows 7 の 32 ビットと 64 ビットのどちらのバージョンであるかによって決まる場所に設定します。 ターゲット フォルダーへのパスは、ユーザーがユーザー単位またはマシン単位のインストールのどちらを選ぶかによって決まります。

インストール コンテキスト システム パスの例
マシン単位 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\\

ユーザー単位の構成データは、ProgramMenuFolder プロパティの値で指定された Programs フォルダーに格納される必要があります。 通常、このフォルダーは次のパスにあります。

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

32 ビット Windows インストーラー パッケージのコンポーネントをインストールする場合は、Directory テーブルの ProgramFilesFolder および CommonFilesFolder プロパティを使用します。 64 ビット Windows インストーラー パッケージのコンポーネントをインストールする場合は、ProgramFiles64Folder および CommonFiles64Folder プロパティを使用します。 アプリケーションに同じコンポーネントの 32 ビットおよび 64 ビット バージョンが同じ名前で含まれている場合は、これらのバージョンが異なるディレクトリに保存されるようにするか、別々の名前を付けます。

次の Directory テーブルは、32 ビットと 64 ビットのコンポーネントが含まれ、アプリケーション間で共有されるコンポーネントがいくつか含まれているパッケージと互換性のあるディレクトリ レイアウトの例を示しています。

ディレクトリ Directory_Parent DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .:Prog32
ProgramFiles64Folder TARGETDIR .:Prog64
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-bit components
Shrx64 SHAREDLOCATIONX64 x64|64-bit components
Binx86 INSTALLLOCATION x32|32-bit components
Binx64 INSTALLLOCATIONX64 x64|64-bit components
App32 Binx86 myapp|unshared 32-bit components
App64 Binx64 myapp|unshared 64-bit components
Share32 Shrx86 shared|shared 32-bit components
Share64 Shrx64 shared|shared 64-bit components

 

ソースでは、この 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 を使用すると、アプリケーションの App Paths レジストリ キーにサブキーが追加され、アプリケーション情報をこのキーの下のレジストリに保存できるようにする登録が実行されます。 App Paths とアプリケーションの登録の詳細については、「シェル開発者ガイド」のシェルの拡張性に関するセクションにある「PerceivedTypes、SystemFileAssociations、およびアプリケーション登録」を参照してください。 インストール時に、ユーザーは、ユーザー単位とマシン単位のどちらのインストール コンテキストでアプリケーションをインストールするかを決定します。 二重目的パッケージの作成時に、パッケージ開発者は、登録が HKEY_LOCAL_MACHINE またはHKEY_CURRENT_USER キーの下で実行される必要があるかどうかを認識できません。

パッケージ開発者は、File テーブルの File フィールドに、アプリケーションの実行可能ファイルのファイル識別子を定義します。

File テーブル (一部)

ファイル Component_ FileName FileSize バージョン Language 属性 シーケンス
MyAppFile ProductComponent PUASAMP1.EXE|PUASample1.exe 81920 0 1

 

レジストリに保存する値は、Registry テーブルの Value フィールドに Formatted 文字列として指定できます。 App Paths レジストリ キーの既定値を指定するには、File テーブルの File フィールドに定義されているファイル識別子と、Formatted 型の [#filekey] 規則を使用します。 最上位の INSTALL アクションは、InstallExecuteSequence テーブルのアクションを実行します。 このテーブルの CostInitializeFileCost、および InstallFinalize アクションが完了すると、Windows インストーラーは Registry テーブルの書式設定された部分文字列 [#MyAppFile] をアプリケーション ファイルへの完全なパスに置き換えます。

このサンプルでは、ルート キーの場所を格納するカスタム プロパティ RegRoot を定義し、ユーザーがマシン単位のインストールを選んだ場合にカスタム アクションを使用してそのプロパティ値をリセットします。 ルートの場所を参照する書式設定された文字列値で、カスタム プロパティ RegRoot を使用します。 Property テーブルでは、PUASample.msi パッケージによってそのカスタム プロパティが定義され、RegRoot の値が HKCU に設定されます。 これにより、二重目的パッケージに推奨される既定のコンテキストである、ユーザー単位のインストール コンテキスト用のプロパティの値が初期化されます。

Property テーブル (一部)

プロパティ
RegRoot HKCU

 

CustomAction テーブルでは、パッケージによって Set_RegRoot_HKLM という名前のカスタム アクションが定義されます。 Type フィールドの値により、これはカスタム アクションの種類 51 標準カスタム アクションと特定されます。 CustomAction テーブルの Source と Target の各フィールドの意味は、カスタム アクションの種類によって異なります。 標準の種類のカスタム アクションの詳細については、「カスタム アクションの種類」を参照してください。 Set_RegRoot_HKLM カスタム アクションの Source フィールドは、RegRoot プロパティの値を示しています。 インストーラーが Set_RegRoot_HKLM カスタム アクションを実行すると、RegRoot プロパティの値が HKLM にリセットされます。

CustomAction テーブル (一部)

アクション Type source 移行先
Set_RegRoot_HKLM 51 [RegRoot] HKLM

 

最上位の INSTALL アクションは、InstallExecuteSequence テーブルのアクションを、そのテーブルの Sequence フィールドに指定された順序で実行します。 Set_RegRoot_HKLM カスタム アクション (1501) の Sequence フィールドに作成された値は、このカスタム アクションをInstallInitialize アクション (1500) の後、ProcessComponents アクション (1600) の前に実行することを示します。このシーケンスにより、確実に Set_RegRoot_HKLM カスタム アクションのレコードがインストール時に評価されます。 InstallExecuteSequence テーブル内のアクションの推奨シーケンスの詳細については、「推奨される InstallExecuteSequence」トピックを参照してください。 Condition フィールドに作成された条件ステートメント構文は、インストール時に ALLUSERS プロパティの値が 1 と評価された場合にのみ、Set_RegRoot_HKLM アクションが実行されることを示します。 ALLUSERS プロパティ値の 1 は、マシン単位のインストールを示します。

InstallExecuteSequence テーブル (一部)

アクション 条件 シーケンス
Set_RegRoot_HKLM ALLUSERS=1 1501

 

Registry テーブルの下記のレコードは、ProductComponent コンポーネントがインストールされる場合に登録を実行します。 Root フィールドの値 -1 は、ユーザー単位のインストール用の HKEY_LOCAL_MACHINE と、ユーザー単位のインストール用の HKEY_CURRENT_USER の下で登録を実行するために必要です。 Registry フィールドに空の文字列を含むレコードは、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 を使用すると、アプリケーション ユーザーが選択済みデバイスに対してハードウェア自動実行の起動を防止できるようにする登録が実行されます。 イベントに応答して自動実行を取り消すためのハンドラーの登録方法については、「シェル開発者ガイド」のシェルの拡張性に関するセクションにある「自動実行で使用するハードウェアとソフトウェアの準備」トピックを参照してください。 次のレコードは、ProductComponent コンポーネントがインストールされるときに Name フィールドに指定されたハンドラーを登録します。 登録がインストール コンテキストに依存する場所にリダイレクトされる必要があることを Windows インストーラーに示すために、Root フィールドの値 -1 が必要です。

Registry テーブル

レジストリ Root キー 名前 コンポーネント
MyAutoplayCancelRegistration -1 SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\CancelAutoplay\CLSID 66A32FE6-229D-427b-A608-D273F40C034C ProductComponent

 

プレビュー ハンドラーの登録

PUASample.msi を使用すると、アプリケーションを起動せずに .pua ファイルの読み取り専用プレビューを有効にするプレビュー ハンドラーをインストールするために必要な登録が実行されます。 プレビュー ハンドラーの登録については、「シェル開発者ガイド」のシェルの拡張性に関するセクションにあるプレビュー ハンドラーの登録に関するトピックを参照してください。 Registry テーブルの下記のレコードは、ProductComponent コンポーネントがインストールされるときにハンドラーを登録します。 登録がインストール コンテキストに依存する場所にリダイレクトされる必要があることを Windows インストーラーに示すために、Root フィールドの値 -1 が必要です。

Registry テーブル

レジストリ 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 Handler 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 Sample 1 Preview Handler 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 Apartment 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