02 Addinプロジェクトの枠組みを作る(1)
検証環境 Sony VAIO PCG-U1
WindowsXP Home(2002)SP1/VB6SP6/MSDN-Lib Oct,2001
さて、とりあえず。動作確認のできるAddinの枠組みを作ってみましょう。
一度骨格を理解しておくと、後々新規作成したり機能拡張する時に便利ですしね。
参考にする元ネタは、MSDN Library Oct,2001版(以下、MSDN)の
[MSDNライブラリ2001年10月]
└[VisualStudio6.0ドキュメント]
└[VisualBasicドキュメント]
└[VisualBasicの使用方法]
└[コンポーネントツールガイド]
└[アドインによるVisualBasic開発環境の拡張]
└[アドインの概要]
└[基本的なアドインの作成]
です。
まぁこのへんを参照しつつ、適当に読み替えながら進めていくことにしましょうか。
まずはVB6を素で起動→[新しいプロジェクト]ダイアログ→[新規作成]タブ→「ActiveX DLL」アイコンを選択→[開く]ボタンクリック。

fig-1. [新しいプロジェクト]ダイアログ
VB起動時に「新しいプロジェクト」ダイアログが表示されている設定になっていないなら、一度起動してメニューバーから[ファイル]-[新しいプロジェクト]→[新しいプロジェクト]ダイアログ(起動時の同名ダイアログとは別モノ)→「ActiveX DLL」アイコンを選択→[OK]ボタンクリック。

fig-2. もうひとつの[新しいプロジェクト]ダイアログ
これで、クラスモジュール「Class1」が用意された新規プロジェクトができるはずです。

fig-3. はじめてのActiveX DLLプロジェクト
次に、メニューバーから[プロジェクト]-[参照設定]→「Microsoft Visual Basic 6.0 Extensibility」と「Microsoft Office X.X Object Library」のチェックボックスをON→[OK]ボタンクリック。

fig-4. VB IDE Addin用ライブラリの参照を追加
VB IDEはMS Officeと同じ機能を使っているので、Officeのライブラリを参照することで自作Addinからそのへんの制御ができるようになるわけなんですが。Officeのライブラリって、そのマシンにインストールされているOfficeのバージョンになっちゃうんですよね。
MSDNでは「8.0」との記述でしたが、私のマシンにはOfficeXPがインストールされているので10.0のライブラリとなります。
このへん、バージョンによって追加/変更/廃止になった機能などもあるかもしれないんですけど。不特定多数への配布、なんて場合はどぅなっちゃうんでしょうね。
Office10のライブラリを参照してコンパイルしたDLLはOffice8の環境下でも正常に動作するのか?とか考えると、ややこしい調査をするよりソース配布で各自参照設定し直し→再コンパイル、とした方がお互いに楽ちんかもしれません。
で、内容を作る前に、プロジェクトとクラスのオブジェクト名を変更しておきましょう。
ちょっと手順を先回りしますが、作成したAddinは、最終的にはアドインマネージャで管理されるわけです。
その際アドインマネージャの一覧に表示される「利用可能なアドイン」名が、この作り方だと「プロジェクト名.クラス名」になっちゃうんですね。
せっかく作ったAddinが「Project1.Class1」では悲しくありませんか私は悲しいです。
てことで、プロジェクト名は「SalvAddin」、クラス名も「clsSalv」とかにしてみます。

fig-5. プロジェクト 改名後
…ほんとはまだちょっぴり悲しいんですけど。
他のアドインが「VB6 APIビューア」とかきちんとした名称になっているのに、自作のものだけソースのモジュール名とかむき出し、ってのもねぇ。
まぁこのへんは後ほど対処するとして、まずはとりあえず動くものを。
次。標準モジュールは、作りません。
要するに、VBAddin.iniの[Add-Ins32]セクションに「SalvAddin.clsSalv=0」の一文があればいいわけで。
わざわざ標準モジュールにプロシージャ起こしてイミディエイトウィンドウから手動で動作させるほどのもんじゃないですね。
配布のことまで考えるのであれば、逆にこんな手動動作ではなく、もっと自動化できるよぅに積極的に作りこむ必要があるわけでしょうし。
のでここでは、エディタで直接VBAddin.iniに書きこむことにします。その方がめんどくさくないし。
VBAddin.iniのありかは、%windows%フォルダです。Windowsがデフォルトオプションでインストールされているのであれば、C:\Windowsに存在しているはず。
特殊なことをしてなければVBAddin.iniには[Add-Ins32]セクションしか存在していないはずですから、最下行に「SalvAddin.clsSalv=0」をさくっと記入→保存→終了。
ここまでできれば、実際の機能を書きこんでいきます。
プロジェクトウィンドウからClass1をダブルクリック→コードウィンドウを表示させて。
「Option Explicit」の行のすぐ下に、「Implements IDTExtensibility」を記入します。

fig-6. 「Implements IDTExtensibility」を書き込んだところ
えーと、Classを使いなれていない方にはあまり見覚えのないステートメントだと思うんですが(そして私もその一人なんですが)。
先ほど「Microsoft Visual Basic 6.0 Extensibility」を参照設定しておきましたよね。これ、AddinとしてIDE側と連携できるようなインターフェイスなんかを用意するためのものなんですが、実際には自作のクラスに必要なインターフェイスを組み込んであげとかないとならないわけです。
で、「Implements IDTExtensibility」を記入することで組み込んだ、といぅことになるんですね。
実際、このステートメントを書きこんで改行したとたんに、コードウィンドウの[オブジェクト]コンボボックスに「IDTExtensibility」といぅ選択肢が表示されるよぅになります。
でもって「IDTExtensibility」を選択してやると、その右側の[プロシージャ]コンボボックスに、OnAddInsUpdate、OnConnection、OnDisconnection、OnStartupCompleteの4つのプロシージャが表示されるようになります。

fig-7. 最初は「(General)」と「Class」だけ

fig-8. 「Implements IDTExtensibility」を書き込むと「IDTExtensibility」が追加される

fig-9. 「IDTExtensibility」を選択するとプロシージャが4つ
この4つのプロシージャは、それぞれ基本的な動作のタイミングで、IDE側からCallされる関数です。
てことは、Addinを作っているこちら側からすると、IDEの状態変更をトリガとして起動するイベントプロシージャ、と理解してもいい感じですね。
| プロシージャ | トリガ | 実際にはどんな時にCallされるか |
| OnConnection | ロードされた時 | アドインマネージャでのロード時と、スタートアップ設定されているならIDEの起動時。 |
| OnDisconnection | アンロードされた時 | アドインマネージャでのアンロード時と、IDEの終了時。 |
| OnStartupComplete | IDEの起動が完了した時 (スタートアップ設定されている時に限る) | VBPやVBGファイルのダブルクリックでIDEを起動した時に、すべてのプロジェクトを読み込み終わって操作できるようになった瞬間。 |
もぅひとつ、OnAddInsUpdateってのがあるんですが、実はこれ、私よくわかっていません。
どぅもアドインマネージャによってスタートアップやロードの状態が変更された時にCallされるよぅなんですが。
MSDNの記述位置によって「VBAddin.iniに変更が保存された時」とか「Addins.Connectプロパティの状態が変化した時」とかちょっと頼りない表現になってしまっているので、ちょっと鵜呑みにしにくいところです。
まぁ今のところは不要なプロシージャですので、項を進めたところで別途動作検証を取るチャンスもあるかもしれません。
これでIDEとの連絡窓口ができました。
ので今度は最低限の動作確認できるコードを記入します。
といっても、このへんはMSDNのコードをそのまんまコピー&ペーストで。

fig-10. 貼り付けた直後のコードウィンドウ

fig-11. ちょっと見にくいので整形してみた直後のコードウィンドウ
ここまでできればとりあえず動作するはず。プロジェクトを保存してから、コンパイルしてみましょう。

fig-12. こんぱーいる
コンパイルが正常に終了したら、IDEを一度終了→改めて先ほど保存したプロジェクトを起動。
メニューバーから[アドイン]-[アドインマネージャ]で「アドインマネージャ」ダイアログを表示させてみましょう。
今までの手順がすべて正常に行われていれば、[利用可能なアドイン]リストに「SalvAddin.clsSalv」が表示されているはずです。

fig-13. 「SalvAddin.clsSalv」が追加された状態のアドインマネージャ
で、動作検証。
「SalvAddin.clsSalv」を選択して、[ロード方法]フレームの[ロード/アンロード]チェックボックスにチェックを入れて[OK]ボタンクリック。
OnConnectionがCallされますので、「アドインが接続されました。」メッセージボックスが表示されます。

fig-14. アドインが接続されました。
同じくアドインマネージャから「SalvAddin.clsSalv」を選択して、[ロード方法]フレームの[ロード/アンロード]チェックボックスのチェックをはずして[OK]ボタンクリック。
OnDisconnectionがCallされますので、「アドインが切断されました。」メッセージボックスが表示されます。

fig-15. アドインが切断されました。
あと、[起動時のロードド]チェックボックスにチェックを入れて[OK]ボタンクリック→IDE終了→再度起動、ってのもやってみてもいいかもしれません。
IDEの起動時にOnConnectionがCallされますので、「アドインが接続されました。」メッセージボックスが表示されます。