none
CABファイル内のファイルを任意の場所へ配置する方法 RRS feed

  • 質問

  • はじめまして。

    現在、既存でWindowsアプリとして実装されている機能の一部(DLL)を、IE上から利用できるように

    VC++でMFC ActiveX コントロールを使って実現しようと考えています。

    この既存で実現済の機能(DLL)は設定情報等を複数の別ファイルで管理しています。

    実現済の機能(DLL)は別ファイルを参照(Read)する際、相対パスで参照しています。

    実現済の機能(DLL)を変更せずにActiveX化したいと考えていますが、その場合、実現済の機能(DLL)および

    各別ファイルを任意の場所に配置する必要があります。

    現時点では、INFファイルでDestDir=10だとWindowsディレクトリ、DestDir=11だとWindows\system32までは指定可能であることは理解しているのですが、更にWindows\system32\hoge\hogehoge.datのように任意の場所へ配置することはできるでしょうか。

    可能な場合、方法などをご教授願えませんでしょうか。


    2011年7月25日 11:05

回答

  • 手元の環境で試してみました。違った方法はあるかもしれませんが、一例として手順をご紹介します。

    1. Visual Studio で [セットアップ プロジェクト] を新規作成する。(プロジェクト名は "HogeHogeDatSetup" にしてみた。)
    2. セットアップ プロジェクトの [ファイル システム] 表示で、[特殊なフォルダーの追加] で [システム フォルダー] を追加する。
    3. [システム フォルダー] に [HogeHoge] フォルダーを追加する。
    4. [HogeHoge] フォルダーに、別に作成しておいたテキスト ファイル "HogeHoge.txt" を追加する。
    5. 必須コンポーネントは適切なものを選択する。(今回はテキスト ファイルのみのため、Windows Installer のみを選択した。)
    6. セットアップ プロジェクトをビルドする。

    ここまでで Setup.exe と HogeHogeDatSetup.msi が作成されます。
    私はこれを自己解凍 CAB 形式にはせずに、そのまま OCX と一緒に CAB 化しました。

    7. 次のような ActiveX 用の INF ファイルを準備します。("HogeHoge.inf" にしてみた。)
    [Setup Hooks]
    hook1=hook1
    
    [hook1]
    run=%EXTRACT_DIR%\setup.exe
    
    [version]
    signature="$CHICAGO$"
    AdvancedINF=2.0
    
    [Add.Code]
    HogeHoge.ocx=HogeHoge.ocx
    Setup.exe=Setup.exe
    HogeHogeDatSetup.msi=HogeHogeDatSetup.msi
    
    [HogeHoge.ocx]
    file-win32-x86=thiscab
    clsid={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
    RegisterServer=yes
    FileVersion=1,0,0,1
    DestDir=11
    
    [Setup.exe]
    file=thiscab
    
    [HogeHogeDatSetup.msi]
    file=thiscab
    


    8. ActiveX 展開用の CAB を作成します。

    cabarc -s 6144 n hogehoge.cab HogeHoge.ocx setup.exe HogeHogeDatSetup.msi HogeHoge.inf


    このような手順で作成した CAB で試したところ、ActiveX のインストール時に HogeHogeDatSetup.msi 用のインストーラーが起動しました。
    C:\Windows\System32\HogeHoge フォルダーが作成され、その中に HogeHoge.txt ファイルがありました。
    あとは、run= で指定しているインストーラーをもっとちゃんとしたものにしたり、.msi ファイルを msiexec でサイレント モードで起動してあげればいいのではないかと思います。

    参考:
    Part 1: Building an ActiveX Control in C# (with CAB file via CabArc) | Philosophy, Technology and Math
    http://www.mrrives.com/Technology/?p=767

    Deploy C# ActiveX in a CAB for Internet Explorer use - Stack Overflow
    http://stackoverflow.com/questions/5484326/deploy-c-activex-in-a-cab-for-internet-explorer-use

    ※※※ここから追記※※※
    次のスレッドが気になったので Windows 7 + IE8 で追試してみました。

    ActiveX Control deployment on Vista using MSI and CAB setup hooks
    http://social.msdn.microsoft.com/Forums/en-SG/ieextensiondevelopment/thread/3d355fb6-8d6a-4177-98c2-a25665510727

    VC++ ランタイムはあらかじめインストールしておいたり、IE8 は管理者として実行したりはしましたが、HogeHogeDatSetup.msi 用のインストーラーは起動しました。
    "run に Window アプリを指定すると終了を待たないから、インストーラーを起動して終了を待つだけのコンソール アプリをかまさないといけないかも" といった趣旨のスレッド(URL は失念)も見かけたのですが、そのようなことはなかったです。
    • 編集済み totojo 2011年7月31日 1:39 Windows7 + IE8 について追記しました。
    • 回答の候補に設定 山本春海 2011年8月9日 8:14
    • 回答としてマーク 山本春海 2011年8月19日 6:53
    2011年7月30日 7:04

すべての返信

  • INF ファイルだけだと任意の場所にファイルを置けないはずなので、専用のインストーラー (.exe) を作って実行するというのではいかがでしょうか。

    About INF File Architecture
    http://msdn.microsoft.com/en-us/library/aa741215(VS.85).aspx

    Using Hooks
    http://msdn.microsoft.com/en-us/library/aa741209(VS.85).aspx

    Internet Explorer では、.inf ファイルで依存 Dll をダウンロードするには、方法
    http://support.microsoft.com/kb/165075/ja
    2011年7月26日 1:54
  • totojo様

    回答いただきありがとうございます。

    返信が遅くなりまして申し訳ありません。

    昨日から情報提供していただいたサイトを参考にテストしてみたのですが、CABファイルが展開できません...。

     

    行ったのは、以下ですが不備、不足等お気づきの点がありましたらご指摘願えますか。

    ①INFファイルを通常のActiveX展開用と任意の場所へ設定ファイルを配置する用の2つを作成する

    ②1つのCABファイルへ全てのファイル(OCX、設定ファイル、2つのINFファイル)を圧縮

    INFファイルは以下のとおり

    【ActiveX展開用】

    ; Sample INF file for HogeHoge.ocx
    [version]
    ; version signature (same for both NT and Win95) do not remove
    signature="$CHICAGO$"
    AdvancedINF=2.0

    [Add.Code]
    HogeHoge.ocx=HogeHoge.ocx
    HogeHoge.txt=HogeHoge.txt

    ; needed File
    [HogeHoge.txt]
    FileVersion=
    hook=HogeHogeDatInstaller

    ; needed DLL
    [HogeHoge.ocx]
    file-win32-x86=thiscab
    clsid={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
    FileVersion=1,0,0,0
    DestDir=11
    RegisterServer=yes

    [HogeHogeDatInstaller]
        file-win32-x86=thiscab
        InfFile=HogeHogeDat.inf
    ; end of INF file

    【任意の場所へ設定ファイルを配置する用】

    [Version]
    Signature="$CHICAGO$"

    [DefaultInstall]
    CopyFiles=MyApp FileList

    [MyApp FileList]
    HogeHoge.txt

    [DestinationDirs]
    MyApp FileList=11,%PlugIn%

    [Strings]
    PlugIn="PlugIn"

    2011年7月27日 9:25
  • イメージとしては、

    ・任意の場所に配置したいモジュール専用のインストーラー (.exe or .msi) を作成する。
    ・ActiveX の CAB の中にインストーラーを含める。
    ・ActiveX の INF の中に Hook をいれて、RUN でインストーラーを実行する。

    といったものになると思います。
    2011年7月27日 10:29
  • 途中経過です。

    totojoさんに提示していただいたサイト&補足を参考に

    1. 任意の場所へ設定ファイルを配置する用のCABファイル(cabarc.exeで-p:ディレクトリ情報を保持を指定 - HogeHogeDat.cab)を作成(6144:署名領域確保の指定なし、INFファイルなし)
    2. 自己解凍ファイル(copy /B extrac32.exe+HogeHogeDat.cab HogeHogeDat.exe)を作成
    3. ActiveX展開用のINFファイルでは自己解凍ファイルを展開後、hookでrunにより自己解凍ファイルを実行するように指定
    4. ActiveX展開用のCABファイルを作成(6144:署名領域確保の指定あり)

    で試してみましたが、ActiveXコントロールと自己解凍ファイルは展開されるのですが、上記3.が行われない状況です。

    何かお気づきの問題点がありましたらご指摘いただけないでしょうか。

    ActiveX展開用のINFファイルは以下のとおりです。

    ----------------------------------------------------------------------------

    ; Sample INF file for HogeHoge.ocx
    [version]
    ; version signature (same for both NT and Win95) do not remove
    signature="$CHICAGO$"
    AdvancedINF=2.0

    [Add.Code]
    HogeHoge.ocx=HogeHoge.ocx
    HogeHogeDat.exe=HogeHogeDat.exe

    ; needed File
    [HogeHogeDat.exe]
    file-win32-x86=thiscab
    FileVersion=
    DestDir=11
    hook=HogeHogeDatInstaller

    ; needed DLL
    [HogeHoge.ocx]
    file-win32-x86=thiscab
    clsid={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
    FileVersion=1,0,0,0
    DestDir=11
    RegisterServer=yes

    [HogeHogeDatInstaller]
    run=%11%\HogeHogeDat.exe /q

    ; end of INF file

    2011年7月29日 11:48
  • 手元の環境で試してみました。違った方法はあるかもしれませんが、一例として手順をご紹介します。

    1. Visual Studio で [セットアップ プロジェクト] を新規作成する。(プロジェクト名は "HogeHogeDatSetup" にしてみた。)
    2. セットアップ プロジェクトの [ファイル システム] 表示で、[特殊なフォルダーの追加] で [システム フォルダー] を追加する。
    3. [システム フォルダー] に [HogeHoge] フォルダーを追加する。
    4. [HogeHoge] フォルダーに、別に作成しておいたテキスト ファイル "HogeHoge.txt" を追加する。
    5. 必須コンポーネントは適切なものを選択する。(今回はテキスト ファイルのみのため、Windows Installer のみを選択した。)
    6. セットアップ プロジェクトをビルドする。

    ここまでで Setup.exe と HogeHogeDatSetup.msi が作成されます。
    私はこれを自己解凍 CAB 形式にはせずに、そのまま OCX と一緒に CAB 化しました。

    7. 次のような ActiveX 用の INF ファイルを準備します。("HogeHoge.inf" にしてみた。)
    [Setup Hooks]
    hook1=hook1
    
    [hook1]
    run=%EXTRACT_DIR%\setup.exe
    
    [version]
    signature="$CHICAGO$"
    AdvancedINF=2.0
    
    [Add.Code]
    HogeHoge.ocx=HogeHoge.ocx
    Setup.exe=Setup.exe
    HogeHogeDatSetup.msi=HogeHogeDatSetup.msi
    
    [HogeHoge.ocx]
    file-win32-x86=thiscab
    clsid={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
    RegisterServer=yes
    FileVersion=1,0,0,1
    DestDir=11
    
    [Setup.exe]
    file=thiscab
    
    [HogeHogeDatSetup.msi]
    file=thiscab
    


    8. ActiveX 展開用の CAB を作成します。

    cabarc -s 6144 n hogehoge.cab HogeHoge.ocx setup.exe HogeHogeDatSetup.msi HogeHoge.inf


    このような手順で作成した CAB で試したところ、ActiveX のインストール時に HogeHogeDatSetup.msi 用のインストーラーが起動しました。
    C:\Windows\System32\HogeHoge フォルダーが作成され、その中に HogeHoge.txt ファイルがありました。
    あとは、run= で指定しているインストーラーをもっとちゃんとしたものにしたり、.msi ファイルを msiexec でサイレント モードで起動してあげればいいのではないかと思います。

    参考:
    Part 1: Building an ActiveX Control in C# (with CAB file via CabArc) | Philosophy, Technology and Math
    http://www.mrrives.com/Technology/?p=767

    Deploy C# ActiveX in a CAB for Internet Explorer use - Stack Overflow
    http://stackoverflow.com/questions/5484326/deploy-c-activex-in-a-cab-for-internet-explorer-use

    ※※※ここから追記※※※
    次のスレッドが気になったので Windows 7 + IE8 で追試してみました。

    ActiveX Control deployment on Vista using MSI and CAB setup hooks
    http://social.msdn.microsoft.com/Forums/en-SG/ieextensiondevelopment/thread/3d355fb6-8d6a-4177-98c2-a25665510727

    VC++ ランタイムはあらかじめインストールしておいたり、IE8 は管理者として実行したりはしましたが、HogeHogeDatSetup.msi 用のインストーラーは起動しました。
    "run に Window アプリを指定すると終了を待たないから、インストーラーを起動して終了を待つだけのコンソール アプリをかまさないといけないかも" といった趣旨のスレッド(URL は失念)も見かけたのですが、そのようなことはなかったです。
    • 編集済み totojo 2011年7月31日 1:39 Windows7 + IE8 について追記しました。
    • 回答の候補に設定 山本春海 2011年8月9日 8:14
    • 回答としてマーク 山本春海 2011年8月19日 6:53
    2011年7月30日 7:04
  • こんにちは、ハシハシ さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
    その後いかがでしょうか。

    参考になるアドバイスをいただいていると思われましたので、他の方にもこの情報を有効活用していただくよう、勝手ながら私のほうで回答としてマークさせていただきました。
    totojo さん、情報ありがとうございます。

    いただいた情報の中で、解決に役立った投稿や、参考になる情報など有効な情報には回答としてマークすることをお願いしています。
    今後、同じ問題でこのスレッドを参照される方にも、有効な情報がわかりやすくなるかと思いますので、ご協力よろしくお願いいたしますね。
    今後とも、MSDN フォーラムをよろしくお願いいたします。それでは。
                                                                      
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年8月19日 6:58