Top > Programmingとか > VB / VB.NET > IDEを使いやすくしたい

2004年05月21日

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」アイコンを選択→[開く]ボタンクリック。

01.gif
fig-1. [新しいプロジェクト]ダイアログ

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

02.gif
fig-2. もうひとつの[新しいプロジェクト]ダイアログ

これで、クラスモジュール「Class1」が用意された新規プロジェクトができるはずです。

03.gif
fig-3. はじめてのActiveX DLLプロジェクト

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

04.gif
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」とかにしてみます。

05.gif
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」を記入します。

06.gif
fig-6. 「Implements IDTExtensibility」を書き込んだところ

えーと、Classを使いなれていない方にはあまり見覚えのないステートメントだと思うんですが(そして私もその一人なんですが)。

先ほど「Microsoft Visual Basic 6.0 Extensibility」を参照設定しておきましたよね。これ、AddinとしてIDE側と連携できるようなインターフェイスなんかを用意するためのものなんですが、実際には自作のクラスに必要なインターフェイスを組み込んであげとかないとならないわけです。
で、「Implements IDTExtensibility」を記入することで組み込んだ、といぅことになるんですね。

実際、このステートメントを書きこんで改行したとたんに、コードウィンドウの[オブジェクト]コンボボックスに「IDTExtensibility」といぅ選択肢が表示されるよぅになります。
でもって「IDTExtensibility」を選択してやると、その右側の[プロシージャ]コンボボックスに、OnAddInsUpdate、OnConnection、OnDisconnection、OnStartupCompleteの4つのプロシージャが表示されるようになります。

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

08.gif

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

09.gif

fig-9. 「IDTExtensibility」を選択するとプロシージャが4つ

この4つのプロシージャは、それぞれ基本的な動作のタイミングで、IDE側からCallされる関数です。
てことは、Addinを作っているこちら側からすると、IDEの状態変更をトリガとして起動するイベントプロシージャ、と理解してもいい感じですね。

プロシージャトリガ実際にはどんな時にCallされるか
OnConnectionロードされた時アドインマネージャでのロード時と、スタートアップ設定されているならIDEの起動時。
OnDisconnectionアンロードされた時アドインマネージャでのアンロード時と、IDEの終了時。
OnStartupCompleteIDEの起動が完了した時
(スタートアップ設定されている時に限る)
VBPやVBGファイルのダブルクリックでIDEを起動した時に、すべてのプロジェクトを読み込み終わって操作できるようになった瞬間。

もぅひとつ、OnAddInsUpdateってのがあるんですが、実はこれ、私よくわかっていません。
どぅもアドインマネージャによってスタートアップやロードの状態が変更された時にCallされるよぅなんですが。
MSDNの記述位置によって「VBAddin.iniに変更が保存された時」とか「Addins.Connectプロパティの状態が変化した時」とかちょっと頼りない表現になってしまっているので、ちょっと鵜呑みにしにくいところです。
まぁ今のところは不要なプロシージャですので、項を進めたところで別途動作検証を取るチャンスもあるかもしれません。



これでIDEとの連絡窓口ができました。
ので今度は最低限の動作確認できるコードを記入します。

といっても、このへんはMSDNのコードをそのまんまコピー&ペーストで。

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

11.gif
fig-11. ちょっと見にくいので整形してみた直後のコードウィンドウ

ここまでできればとりあえず動作するはず。プロジェクトを保存してから、コンパイルしてみましょう。

12.gif
fig-12. こんぱーいる

コンパイルが正常に終了したら、IDEを一度終了→改めて先ほど保存したプロジェクトを起動。

メニューバーから[アドイン]-[アドインマネージャ]で「アドインマネージャ」ダイアログを表示させてみましょう。
今までの手順がすべて正常に行われていれば、[利用可能なアドイン]リストに「SalvAddin.clsSalv」が表示されているはずです。

13.gif
fig-13. 「SalvAddin.clsSalv」が追加された状態のアドインマネージャ

で、動作検証。

「SalvAddin.clsSalv」を選択して、[ロード方法]フレームの[ロード/アンロード]チェックボックスにチェックを入れて[OK]ボタンクリック。

OnConnectionがCallされますので、「アドインが接続されました。」メッセージボックスが表示されます。

14.gif
fig-14. アドインが接続されました。

同じくアドインマネージャから「SalvAddin.clsSalv」を選択して、[ロード方法]フレームの[ロード/アンロード]チェックボックスのチェックをはずして[OK]ボタンクリック。

OnDisconnectionがCallされますので、「アドインが切断されました。」メッセージボックスが表示されます。

15.gif
fig-15. アドインが切断されました。

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

→ おっけー。ここまでは。

2004年05月17日

01 VB IDE

検証環境 Sony VAIO PCG-U1
WindowsXP Home(2002)SP1/VB6SP6/MSDN-Lib Oct,2001

VBに限らず、いわゆるプログラミング言語は、プログラムのソースを作るエディタと、できあがったプログラムのソースをパソコンで動作できる形式に変換するコンパイラの2本立てで作業するようになっています。

とはいぅものの、このへん実際には言語によってどーいぅふにそれぞれの機能を用意しているかってのはずいぶん違うんですけどね。

たとえば、一番スタンダードなのはVC++でしょうか。

これはコンパイラとしてCL.EXEってのが用意されてまして。このコンパイラでマシン語に変換できるよぅなプログラムが書かれているテキストファイルを指定してやれば、とにかくプログラムファイルができるわけです。
このテキストファイルを書くのは、どんなプログラムを使ってもかまいません。充分VC++の文法を熟知し間違わない自信があるなら、秀丸などのテキストエディタで一気に書いてしまったってかまわないんです。

でもまぁ、現実的には。
プログラム言語のヘルプなども参照したいでしょうし、キーワードなんかもなるべく打ち間違いのないよぅ入力しやすい専用のエディタとかがあった方が便利です。

といぅわけで、VC++にはそれ専用のエディタが付属しています。Microsoft Developer's Studio(MSDEV.EXE)。

MSDEV.EXEは、スタートメニューから「Visual C++」を選択されると起動するプログラムです。スプラッシュには「Visual C++」と表示されるせいもあって、これこそがVC++と思っている方も多いかもしれません。
が、これは単に「プログラムコードの記入やリソースの生成ができる」「コンパイラを実行させることができる」「必要に応じてヘルプを参照できるようにmsdnと連係動作ができる」「デバッグ時に各種情報を参照したりステップ実行させることができる」ただのエディタにすぎません。

そーいぅ意味では、VB6はちょっと変則的な提供形態となっています。

エディタ機能とコンパイラ機能の両方でVB6.EXE。

コンパイラは普通バッチ処理ができるようにコマンドラインからの起動が可能になっています。
VB6も一応そのへんはフォローしてあって、「/make」オプションを付けて起動すると、直接コンパイルできるような仕組みになっています。
他にもさまざまなオプションが用意されていますので、興味のある方は「/?」オプションを付けて起動してみるとおもしろいかもしれません。起動オプションの一覧が表示されます。



とまぁ、ぐるりと遠回りをしてVB6の開発環境の仕組みを述べてきたわけですが。

エディタとしてのVB6(オプションなしで起動した場合に表示されるメニューバーとかプロジェクトウィンドウとかコードウィンドウとかなんかそのへん)を「IDE」と言うんですよ、と言いたかったわけです。

まぁ厳密にはちょっと違うような気もしますけれども、だいたいそんな感覚で把握していただけるとおっけーかと。

でもって、IDE(エディタとしてのVB6)には、Addinと呼ばれる、IDEの機能を拡張できるプログラムを取り込める(といぅか取り込まれるといぅか)仕様になっており、それ用のインターフェイスが用意されているんですよ、と言いたかったわけです。

最初からAddinの説明だけしてもよかったんですが、IDEといぅ概念とVB6のプログラムとしての実体をちょっと把握しておいていただきたかったもんですから。
これ、理解しておくといろんな局面でちょこちょこと便利です。



ついでですので、本コンテンツをおいしく読んでいただくためにもぅ少し前振り。

2004.03.30、VB6に久々のServicePackが提供されました。SP6ですね。
まさか今さらSPが提供されるとは思わなかったなぁ。
62MBってのはちょっと大きいですが、ブロードバンドもそれなりに普及してきた昨今、さほど無理なサイズだとも思わなくなってきました。

興味のある方はこちらから。日本マイクロソフトのサポート技術情報なんですけど、フィックスネタのほとんどが英文なので@nifty翻訳をかましてみました。 AMIKAIって翻訳エンジンを使ってるんですけど、なぜか同じAMIKAIを使っているExcite翻訳ではこんなんなっちゃうので、今回は@niftyから。なんでしょうかね、これ。

ちなみに日本マイクロソフトの元ページはこちら
アップデート概要はこちらにあります。

Visual Basic に対する主要な修正は、Visual Basic ランタイム DLL に対して加えられた、安定性とセキュリティの強化に関係しています。

などと書かれていますが、個々の修正内容を見てみると、結構動作上のバグフィックスも多く。今まで不便を感じていなかったので、たぶん私の使う範囲の機能には無関係なんでしょうけど、何となく安心感があるよぅな気がしますので、今回のSPは当てておくことにします。

自分も安心しておきたい、といぅ方はこちら



で。
なんでAddinの話をするのにこんなことを説明しているかといぅと、単に本コンテンツはVB6SP6で動作検証してるんですよーと言いたかっただけなんですが。

ついでに、今回参照とか引用とかしているMSDN LibraryはOct,2001(日本語)版です。
本サイトのどっか別のとこにも書いたよぅな気がするんですけど、VisualStudio6.0に対応したMSDN Libraryは、これが最新版といぅか最終版といぅかなんかそんなところで。
この次の版から.NET用のLibraryになっちゃっていますので、私は未だ後生大事にOct,2001版を使っています。
Oct,2003版(.NET対応)もインストしてありますので、小さいサブノートのHDDの3GB以上がMSDN Libraryに占拠されている状態です。
CPUが非力だといぅこともあって、表示するごとにけっこぅツラい思いをしているんですよ。
現時点で唯一の環境ですので、もちろん大事にしてはいるんですけどね。

そーいぅ意味でも、そろそろメイン環境のある札幌に帰りたいなぁ…。

→ 次回から実践です。