IE 向け アドオン の インストーラー 開発

0 件のコメント

Windows Installer XML (WiX) toolset を 利用して、Internet Explorer 向け アドオン の インストーラー を開発します。 開発した アドオン を エンドユーザー に利用してもらうために必要な処理 ──「コンポーネントの配置」「レジストリ登録」── を実行する インストーラー を作成します。 今回は以前書いた "IE の アドオン 開発" の続編になります。

サンプルコードのダウンロード
(※2013/06/26 WiX3.5 だとコンパイルエラーが起こりました。WiX3.7 以上でお試しください。)

  1. 概要
  2. セットアップ プロジェクト の作成
  3. インストーラー の実装
  4. コンパイル
  5. テスト

※WiX をまだインストールされていない場合は、以下のサイトからダウンロード & インストールをお願いいたします。
WiX Toolset - Download

概要

以前書いた記事 だと、IE 上で動作する ActiveX は作成、検証まではできています。 アドオンはちゃんとできているし動いているけれど、インストーラーを作ることで、次のようなことを提供できるようにしようと思います。

  • エンドユーザーが利用できる環境を作る(配置とレジストリ登録)
  • [ツール]-[アドオンの管理] に作成したアドオンを表示する

今回のインストーラーでは最低限の機能を提供するにとどめているため、 インストーラーは英語のままだったり、プログラムの追加と削除にアイコンがなかったり、製品名や会社名の表記が不完全だったりする部分があります。 これらはまた時間があるときに…。。

セットアップ プロジェクト の 作成

  1. [ファイル]-[新規作成]-[プロジェクト]を選択
  2. 「Windows Installer XML」 の 「Setup Project」を選択
    以下の項目を入力して「OK」を選択
    • 名前
    • 場所
    • ソリューション名
  3. 「ソリューションエクスプローラー」から「References」を右クリック-[参照の追加]を選択
  4. 「参照」タブで次のファイルを追加
    ※標準設定で WiX toolset を インストール している場合、"C:\Program Files\WiX Toolset v3.7\bin"にあります。
    • WixNetFxExtension.dll
    • WixUIExtension.dll

ソリューション/プロジェクトを作成しただけだと、.NET Framework のチェック および 画面付きのインストーラーが作れないため、参照設定を追加しています。 WixNetFxExtension.dll の参照で、 .NET Framework のインストール状況のチェックを行えるようにする拡張機能が利用できるようになります。 WixUIExtension.dll の参照で、画面付きインストーラーが作れるようになります。

インストーラー の 実装

ソースコードは Product.wxsComponents.wxs の2ファイルだけです。

Product.wxs はソリューション作成時にあるファイルの修正を行います。 インストーラーの画面構成、.NET Frameworkインストール状況のチェック、インストール構成(完全 or カスタム or オヌヌメ)、インストールディレクトリ構成を設定します。

Components.wxs は WiX toolset に付属するツールを利用して自動生成したものを修正します。 実際にインストールするファイル、登録するレジストリ情報を設定します。

Product.wxs

修正前

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="SetupProject" Language="1033" Version="1.0.0.0" Manufacturer="" UpgradeCode="a08f60e3-67db-4b13-bc5c-195124554fb1">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate />

    <Feature Id="ProductFeature" Title="SetupProject" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
    </Feature>
  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="SetupProject" />
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
      <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
      <!-- <Component Id="ProductComponent"> -->
      <!-- TODO: Insert files, registry keys, and other resources here. -->
      <!-- </Component> -->
    </ComponentGroup>
  </Fragment>
</Wix>

修正後

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="Sample Product" Language="1033" Version="1.0.0.0" Manufacturer="Sample Co. Ltd." UpgradeCode="a08f60e3-67db-4b13-bc5c-195124554fb1">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate />

    <Feature Id="ProductFeature" Title="SetupProject" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
    </Feature>

    <UIRef Id="WixUI_Mondo" />
    <PropertyRef Id="NETFRAMEWORK35" />
    <Condition Message="This application requires .NET Framework X.Y.">Installed OR NETFRAMEWORK35</Condition>
  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="SetupProject" />
      </Directory>
    </Directory>
  </Fragment>
</Wix>

"修正前" の XML に対して、以下のような修正を行います。 (すべての修正を行った結果が "修正後" になります。)

  • [修正] //WiX/Product/@Name
    Product要素のName属性を実際の 製品名 に修正します。
  • [修正] //WiX/Product/@Manufacture
    Product要素のManufacture属性に 会社名 を記載します。
  • [追加] //WiX/Product/UIRef
    以下の要素を追加します。 これにより、インストール時によく見かける画面を追加することができます。 また、この機能を利用するために WixUIExtension.dll を参照設定しています。
    <UIRef Id="WixUI_Mondo" />
    
  • [追加] //WiX/Product/PropertyRef
    [追加] //WiX/Product/Condition
    以下の要素を追加します。 これにより、インストール時に .NET Framework 3.5 が入っていないとエラーメッセージがでるようになります。 また、この機能を利用するために WixNetFxExtension.dll を参照設定しています。
    <PropertyRef Id="NETFRAMEWORK35" />
    <Condition Message="This application requires .NET Framework X.Y.">Installed OR NETFRAMEWORK35</Condition>
    
  • [削除] //WiX/Fragment[name(child)="ComponentGroup"]
    子要素が ComponentGroup である Fragment要素を削除します。 (この要素の内容は Components.wxs ファイルへ記載します。)

Components.wxs

自動生成結果

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>
    <DirectoryRef Id="TARGETDIR">
      <Directory Id="dir4DBD5D1D35BB67517C2CB9713EA6BB0E" Name="WiX" />
    </DirectoryRef>
  </Fragment>
  <Fragment>
    <DirectoryRef Id="dir4DBD5D1D35BB67517C2CB9713EA6BB0E">
      <Component Id="cmpDB54D4524917C8B707E5BBF38A699D28" Guid="PUT-GUID-HERE">
        <Class Id="{234E6679-2F92-368C-ABD4-89F063D07579}" Context="InprocServer32" Description="Sample.ActiveXPlugIn.IObjectSafetyTLB" ThreadingModel="both" ForeignServer="mscoree.dll">
          <ProgId Id="Sample.ActiveXPlugIn.IObjectSafetyTLB" Description="Sample.ActiveXPlugIn.IObjectSafetyTLB" />
        </Class>
        <Class Id="{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}" Context="InprocServer32" Description="Sample.ActiveXPlugIn.MyForm" ThreadingModel="both" ForeignServer="mscoree.dll">
          <ProgId Id="Sample.ActiveXPlugIn.MyForm" Description="Sample.ActiveXPlugIn.MyForm" />
        </Class>
        <Class Id="{EBD6E54B-8223-313B-A575-110E1BA8D32C}" Context="InprocServer32" Description="Sample.ActiveXPlugIn.Form1" ThreadingModel="both" ForeignServer="mscoree.dll">
          <ProgId Id="Sample.ActiveXPlugIn.Form1" Description="Sample.ActiveXPlugIn.Form1" />
        </Class>
        <File Id="filCC77BD2DCA029040BCFF7EBD663B08E2" KeyPath="yes" Source="SourceDir\WiX\SampleActiveXPlugIn.dll" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32\1.0.0.0" Name="Class" Value="Sample.ActiveXPlugIn.IObjectSafetyTLB" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32\1.0.0.0" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32" Name="Class" Value="Sample.ActiveXPlugIn.IObjectSafetyTLB" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32\1.0.0.0" Name="Class" Value="Sample.ActiveXPlugIn.MyForm" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32\1.0.0.0" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32" Name="Class" Value="Sample.ActiveXPlugIn.MyForm" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32\1.0.0.0" Name="Class" Value="Sample.ActiveXPlugIn.Form1" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32\1.0.0.0" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32" Name="Class" Value="Sample.ActiveXPlugIn.Form1" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
      </Component>
    </DirectoryRef>
  </Fragment>
</Wix>

修正後

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
      <Component Id="cmpDB54D4524917C8B707E5BBF38A699D28" Guid="C8BA8C74-F2A4-4A53-9FC4-92CDC7897287">
        <Class Id="{234E6679-2F92-368C-ABD4-89F063D07579}" Context="InprocServer32" Description="Sample.ActiveXPlugIn.IObjectSafetyTLB" ThreadingModel="both" ForeignServer="mscoree.dll">
          <ProgId Id="Sample.ActiveXPlugIn.IObjectSafetyTLB" Description="Sample.ActiveXPlugIn.IObjectSafetyTLB" />
        </Class>
        <Class Id="{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}" Context="InprocServer32" Description="Sample.ActiveXPlugIn.MyForm" ThreadingModel="both" ForeignServer="mscoree.dll">
          <ProgId Id="Sample.ActiveXPlugIn.MyForm" Description="Sample.ActiveXPlugIn.MyForm" />
        </Class>
        <Class Id="{EBD6E54B-8223-313B-A575-110E1BA8D32C}" Context="InprocServer32" Description="Sample.ActiveXPlugIn.Form1" ThreadingModel="both" ForeignServer="mscoree.dll">
          <ProgId Id="Sample.ActiveXPlugIn.Form1" Description="Sample.ActiveXPlugIn.Form1" />
        </Class>
        <File Id="filCC77BD2DCA029040BCFF7EBD663B08E2" KeyPath="yes" Source=".\SourceDir\SampleActiveXPlugIn.dll" />
        <RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Ext\PreApproved\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}" Value="" Type="string"  Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32\1.0.0.0" Name="Class" Value="Sample.ActiveXPlugIn.IObjectSafetyTLB" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32\1.0.0.0" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32" Name="Class" Value="Sample.ActiveXPlugIn.IObjectSafetyTLB" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{234E6679-2F92-368C-ABD4-89F063D07579}\InprocServer32" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}" Value="" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}" Value="" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32\1.0.0.0" Name="Class" Value="Sample.ActiveXPlugIn.MyForm" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32\1.0.0.0" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32" Name="Class" Value="Sample.ActiveXPlugIn.MyForm" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\InprocServer32" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32\1.0.0.0" Name="Class" Value="Sample.ActiveXPlugIn.Form1" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32\1.0.0.0" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32" Name="Class" Value="Sample.ActiveXPlugIn.Form1" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32" Name="Assembly" Value="SampleActiveXPlugIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
        <RegistryValue Root="HKCR" Key="CLSID\{EBD6E54B-8223-313B-A575-110E1BA8D32C}\InprocServer32" Name="CodeBase" Value="file:///[#filCC77BD2DCA029040BCFF7EBD663B08E2]" Type="string" Action="write" />
      </Component>
    </ComponentGroup>
  </Fragment>
</Wix>

まず、以下の手順でレジストリ登録すべき情報を抽出します。 現状はファイルが1つなので手作業で行うことも不可能ではないですが… ファイル数が多くなると手作業では難しくなるので以下の手順で自動生成がオススメです。

コマンド例

set PATH=%PATH%;C:\Program Files\WiX Toolset v3.7\bin
heat file SampleActiveXPlugIn.dll -out Components.wxs

構文

heat file [dllファイル名] -out [出力ファイル名]

自動生成したファイルに対して以下の修正を行います。 すべての修正を行った結果が "修正後" になります。

  • [削除] //WiX/Fragment[DirectoryRef@Id="TARGET"]
    Id属性 が TARGET である DirectoryRef 要素を子要素に持つ Fragment 要素を削除します。
  • [修正] //WiX/Fragment/DirectoryRef[@Id="dir4DBD5D1D35BB67517C2CB9713EA6BB0E"]
    Id が "dir4DBD5D1D35BB67517C2CB9713EA6BB0E"(GUIDを利用しているので実際は異なる場合があります) の DirectoryRef要素 を ComponentGroup要素に置き換えます。 その際、Id 属性は Product.wxs の "//WiX/Product/Feature/ComponentGroupRef/@Id" 属性値を参照し、 Directory 属性 は Product.wxs の "//WiX/Fragment/Directory/Directory/Directory/@Id" 属性値を参照します。
    <ComponentGroup Id="ProductComponents" Direcory="INSTALLFOLDER">
        |…
    </ComponentGroup>
    
  • [修正] //WiX/Fragment/DirectoryRef/Component/@Guid
    新しい GUID を発行して記載します。
  • [修正] //WiX/Fragment/DirectoryRef/Component/File/@Source
    プロジェクトディレクトリから見た dll ファイルへのパスに修正します。 ソリューションが同じであれば本当は良いのですが… そうもいかないので、プロジェクト内に "SourceDir" ディレクトリを作成、インストールするファイルをコピーして配置し、そこへの参照としました。
  • [追加] //WiX/Fragment/DirectoryRef/Component/RegistryValue
    以下のレジストリキーを追加します。 このキーを追加することで、IE の "アドオンの管理" へ項目を追加することができます。 また、このキーは IE に安全なアドオンとして登録ができ、警告を抑止することができます。 このレジストリに関する詳細は こちら をご参照ください。
    ※GUID部分({273737CB-CA7D-45C5-84F6-EF4D5A3D8C79})は実際のGUIDへ書き換えてください。
    <RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Ext\PreApproved\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}" Value="" Type="string"  Action="write" />
    
  • [追加] //WiX/Fragment/DirectoryRef/Component/RegistryValue
    以下のレジストリキーを追加します。 このキーを追加することで、IE はこのアドオンが安全であると認識するようになります。 このレジストリに関する詳細は こちら をご参照ください。
    ※GUID部分({273737CB-CA7D-45C5-84F6-EF4D5A3D8C79})は実際のGUIDへ書き換えてください。
    <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}" Value="" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{273737CB-CA7D-45C5-84F6-EF4D5A3D8C79}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}" Value="" Type="string" Action="write" />
    

コンパイル

Visual Studio を利用している場合、以下の手順でコンパイルできます。 出力先は設定によりますが… デフォルト だと bin\Debug または bin\Release の下になります。

  1. ソリューション エクスプローラー から セットアップ プロジェクト を選択
  2. 右クリック-[ビルド] を選択

テスト

テスト実行する前に、regedit でインストールされる予定のレジストリ情報を削除しておきます。

レジストリの削除が終わると、いざテスト実行です。 [Next] を押していって、作成した アドオン を インストール します。

インストールが完了した後、以下の2点の動作確認を行います。

  • テストページが実行可能であること。
  • Internet Explorer の "アドオン の管理" に追加されていること。

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!