トップ回答者
CABファイル内のファイルを任意の場所へ配置する方法

質問
-
はじめまして。
現在、既存で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のように任意の場所へ配置することはできるでしょうか。
可能な場合、方法などをご教授願えませんでしょうか。
回答
-
手元の環境で試してみました。違った方法はあるかもしれませんが、一例として手順をご紹介します。
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 は失念)も見かけたのですが、そのようなことはなかったです。
すべての返信
-
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 -
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" -
途中経過です。
totojoさんに提示していただいたサイト&補足を参考に
- 任意の場所へ設定ファイルを配置する用のCABファイル(cabarc.exeで-p:ディレクトリ情報を保持を指定 - HogeHogeDat.cab)を作成(6144:署名領域確保の指定なし、INFファイルなし)
- 自己解凍ファイル(copy /B extrac32.exe+HogeHogeDat.cab HogeHogeDat.exe)を作成
- ActiveX展開用のINFファイルでは自己解凍ファイルを展開後、hookでrunにより自己解凍ファイルを実行するように指定
- 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 -
手元の環境で試してみました。違った方法はあるかもしれませんが、一例として手順をご紹介します。
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 は失念)も見かけたのですが、そのようなことはなかったです。 -
こんにちは、ハシハシ さん。
MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
その後いかがでしょうか。
参考になるアドバイスをいただいていると思われましたので、他の方にもこの情報を有効活用していただくよう、勝手ながら私のほうで回答としてマークさせていただきました。
totojo さん、情報ありがとうございます。
いただいた情報の中で、解決に役立った投稿や、参考になる情報など有効な情報には回答としてマークすることをお願いしています。
今後、同じ問題でこのスレッドを参照される方にも、有効な情報がわかりやすくなるかと思いますので、ご協力よろしくお願いいたしますね。
今後とも、MSDN フォーラムをよろしくお願いいたします。それでは。
日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海