Light Cutter 5 をバージョンアップするために始めた連載 「ラストスパート Visual Basic 6.0」 第2回は、ソースコードを Team Foundation Server に移行して改修し、インストーラーを作成します。
今回はまだ .net での機能追加は行いませんが、インストーラは .net の追加機能に対応できるように、VB6用の Visual Studio Installer と、.net 用の Visual Studio 2010 の両方を使って作成します。
目次
ソース管理を VSS から TFS へ
まず、Visual SourceSafe 2005 を使って、以前のソース管理から VB6のコードを取得します。
ここで .scc ファイルは、Visual SourceSafeでのソース管理の関連づけを保存するファイルなので、これを削除してしまいます。
こうしてプロジェクトを開くと、VSSに登録するか?聞かれるので「いいえ」を選択します。一度保存ボタンをおして VB6 を終了すると、次回からVSSに登録するか?は聞かれません。
exe を作成して、Light Cutter 5 の最新版を一度実行してみます。
ちゃんと動作しているように見えますね。ここで、ソース管理を VSS から TFS に移動してしまいます。
Team Explorer for Visual Studio 2012 を起動して、自分の TFSへ接続します。
ソース管理エクスプローラーを起動して、ローカルパスを マップ したら、そのフォルダを Explorer で開きます。必要に応じて、新しいアプリを登録する新しいチームプロジェクトを作成します。今回、Light Cutter 専用のチームプロジェクトを作成しました。
エクスプローラで、新しいTFSの作業フォルダに、VSSの作業フォルダからファイルをフォルダごと移動します。
この時、VB6 のフォルダが古い管理のままの(1フォルダ階層しかない)場合はもうひとつ新たにフォルダを作って、その中に入れると、最近の Visual Studio のソリューションフォルダのように扱うことが出来ます。
ソース管理エクスプローラーに戻って、「最新の情報に更新」を押した後、プロジェクトフォルダを右クリックして「項目をフォルダーに追加」を選択します。
これで追加したい項目を全て選んで、ソース管理に追加します。
まだ追加を指示しただけで、ソース管理にはチェックインされていません。「保留中の項目をチェックイン」を選択して、全てソース管理に登録を完了します。
後は、操作方法は VSS と同様。TFS でもほとんど変わらずに作業できます。
TFSの設定によってはファイルを変更する前に、ソース管理エクスプローラで「チェックアウト」します。Visual Basic には TFS 用のアドインがないため、自動ではチェックアウトされません。最近のTFSは既定値では、チェックアウトの必要は無いかもしれません。
Visual Basic 6 でプログラムを改修
さて今回のメインは Winキー + C が Windows 8 ではチャームに割り当たった事なので、それを改修します。確認のために Light Cutter 5 を起動して、オプションで Win + C が使えるようにしても、確かにチャームが表示されてしまいます。えぇ、知っていました。
とりあえず Win + Shift + C にでも割り当ててみますか
早速起動して、Win + Shift + C を押すと、おぉ、ちゃんと起動しますね。成功です。
後はオプション画面の表記を Win + C から Win + Shift + C に変更すればOKですね。バージョンも ver.5.3 に上げて、これで改修は完了なので、ソース管理エクスプローラでまたソースをチェックインします。
Visual Studio Installer 1.1 でセットアップを作成
Visual Studio Installer の新しいプロジェクトを作成します。場所は、ソース管理のVB6のファイルフォルダと並列に並ぶように新しい専用のフォルダを作成します。
ウィザードで VB6 のプロジェクトを指定します。
Windows Vista, Windows 7, Windows 8 では、VB6 のランタイムが、OSに標準で組み込まれていて、またそのバージョンも、 VB6が出荷された当時よりも新しいバージョンになっているため、いくつか警告が出ますがそれは無視して先に進めます。
ビルドすると msi ファイルができあがります。
実行するといつものセットアップ画面が表示されますね。必要に応じて背景やアイコン、使用条件のリッチテキストファイルを追加・変更してセットアップの完成です。
既存の VB6 で作成したアプリケーションのインストーラを作成するだけなら、これで問題ありません。しかし将来的には、最新の .net で作成した DLL を COM相互運用にして、VB6 と .net のハイブリッドアプリを作ることを考えます。その場合には、Visual Studio Installer で VB6 のマージモジュールを作成し、最新の Visual Studio で .net 用のセットアップにそれを組み込んで、一つのインストーラとしてインストールすることが出来ます。
今回は、.net のDLLは作成していませんが、将来的に機能を追加する予定があるのであれば、マージモジュールの作成まで行ってしまいましょう。
Visual Studio Installer 1.1 でマージモジュールの作成
新たに「マージモジュール」を作成します。.msi ファイルがそのままセットアップ出来るファイルになっているなら、マージモジュール .msm ファイルは、他のセットアップに追加して一緒にインストールされるようにするためのファイルです。
Visual Studio Installer 1.1 でマージモジュールを作成して、そのファイルを最新の.net で作成した DLL 用のインストーラに含めてしまうことで、一緒にインストール出来るようにしてしまおう!という作戦です。
Visual Studio Installer 1.1 の「プロジェクト エクスプローラ」で、ソリューションを右クリックして「プロジェクトの追加」を選びます。
セットアップを作った時と似た画面が表示されますが、違いは「現在のソリューションへ追加」となっていることです。新しい名前をつけて、「開く」を押します。
再びウィザードが開くので、同じくVB6のプロジェクトを指定した後、今度は「マージモジュールの作成」を選びます。
こんな感じで追加されます。ツリーの表示では、どちらも VB6 で作った exe の名前が表示されているので、どちらがセットアップか?わかりづらいですね。右クリックして名前を変更しましょう。
念のため右クリックでプロパティを表示すれば、どちらがセットアップ(msi)を出力するか、マージモジュール(msm)を出力するか?わかります。
ビルドすると msm ファイルが作られます。
ここまででいったん、ソース管理に追加します。Team Explorer のソース管理エクスプローラに戻って、「項目をフォルダーに追加」を実行します。
作成したセットアップとセットアップモジュールのフォルダを選んで「次へ」を選択。さらにファイルを全て選んで「完了」します。
このとき ~LightCutterSetup.wip という ~ で始まるファイルが作られている場合がありますが、これは Visual Studio Installer が実行中に作られるファイルで不要です。また、これはロックされていてチェックインできません。
一度 Visual Studio Installer を終了しておくと、これらのファイルが消えます。これらのファイルを除外して(追加してしまったら削除して)、チェックインすればOKです。
Visual Studio 2010 でセットアップを作成
今回、最新の 2012 ではなく一つ前の Visual Studio 2010 でセットアップを作成します。その理由は、最新の 2012 ではセットアップ作成機能が標準ではなくなり、InstallShield を別途用意する必要があるからです。残念~
※後述しますが、無料の InstallShield Limited で、MSM をパッケージに含める方法は、あるにはあるのですが、ちょっとイマイチなので今回は 2010 で行きます。
まず、Visual Studio 2010 のソース管理エクスプローラで(あるいは 2012 でもかまいません)、TFSからさっきチョックインしたマージモジュールとプロジェクトを取得しておきます。
Visual Studio 2010 で新しいプロジェクトを作成します。「セットアップと配置」の「Visual Studio インストーラー」を選択します。
ここでは SetupIntegration (セットアップ統合)というような名前をつけておきます。
新しいセットアッププロジェクトが出来たら、ソリューション エクスプローラ から「追加」で「マージモジュール」を選択します。ダイアログが表示されるので、Visual Studio Installer 1.1 で作成したマージモジュールを指定します。
こんな感じでマージモジュールが追加されます。
ついでに試しにテキストでも追加してみます。必要に応じて .net の DLL や exe をプライマリ出力として追加することが出来ます。これにより、VB6と .net のプログラムを同時にインストールすることが可能です。
ビルドするとこんな感じで msi ファイルができあがります。名前やウィザード用のプロパティは適宜変更します。
早速インストールすると、新しいセットアップのプロパティに応じて画面が表示されているのが確認できます。もちろんインストールもちゃんと出来ます。インストール先にも、新しいセットアップで追加したファイルが、Visual Studio Installer 1.1 で追加したVB6のファイルと一緒にインストールされていることが確認できます。
新しく作成したインストーラでインストールしてひととおり動作を確認できたら、一旦作業は完了です。後は .net で開発する新機能を考えるだけですね。
次回は、いよいよ .net で VB6 アプリに機能を追加します。
Visual Studio 2012 + InstallShield Limited Editon ではマージモジュールを追加したインストールは作れるか?
最後におまけです。Visual Studio 2012 では、Visual Studio インストーラの作成機能が標準ではなくなったため、上記の 2010 と同じ操作ができません。
その代わりに、InstallShield Limited Edition をダウンロードしてインストールすることが出来ます。Visual Studio のプロジェクトの追加から「InstallShield Limited Edition の有効化」を選ぶとダウンロードして機能を追加できます。
Webサイトではユーザー登録が必要です。
インストールが完了すると、「InstallShield Limited Edition Project」が作成出来るようになります。
こんな感じでウィザード形式でインストーラを作ることが出来ます。機能限定版ですが最低限のインストーラは作成できます。
さて、これで VB6 アプリのマージモジュール(.msm)ファイルを取り込んでインストーラは作れるでしょうか・・・
ソリューション エクスプローラーで、2 Specify Application Data のツリーを開いて、Redistributables を開くと追加できそうです。ここでは、Visual C++ 用のマージモジュールや、.net Framework 3.5 の言語パックなどが並んでいるのが確認できます。
確かにここでマージモジュールを追加してインストーラを作成することが出来ます。ただし、このマージモジュールは、ソース管理上のプロジェクトフォルダからの相対パスで認識してくれるわけではなく、絶対パスで取り込まれます。正確には、マージモジュールが保存されているフォルダが、マージモジュールの検索先として登録され、その中の1ファイルとして認識されます。どうやらマージモジュールは、開発PCのどこかにまとめて保存されているべきもの、という考え方のようですね。自分で作成したアプリのマージモジュールを、バージョン管理の様な深いフォルダに登録しておくことは考えられていないようです。
ソース管理上の深いパスで登録して試しにビルドすると、パスが長すぎてビルドできないというエラーが表示されました。
ドライブの直下のフォルダなど、パスの短いところに移動すると確かにビルドできてインストールも出来ます。しかし、これでは近代のソース管理上、とても運用出来る状態ではないでしょう。今回私はこの方法は採用しないことにしました。
VB6用アプリのセットアップを作成する場合、追加機能で .net 4.5 を使うというのでなければ、Visual Studio Installer 1.1 と Visual Studio 2010 を使うのが良いように思います。