Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

ここで作るもの ・・・ 簡単な COM+ コンポーネント

まずは出来上がりからみてください。

ここで作る COM コンポーネントを利用すると、次のような VBScript コードからデバッグトレースにメッセージを出力することが可能です。

Dim obj
Set obj = CreateObject( "KeicodeTest.DebugTrace" )
obj.Write "Hello, world!"
Set obj = Nothing

プログラム識別子 (ProgID) は "KeicodeTest.DebugTrace" であり、そのオブジェクトは文字列をひとつ受け取る Write メソッドを持っています。

デバッグトレースはデバッガ、あるいは、次のスクリーンショットのように DebugView などで確認することが可能です。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

デバッグトレースに関しては、OutputDebugString API を呼び出せば OK です。ここでは、BSTR を受け取る (すなわちワイドキャラクタの文字列を受け取る) ので、 OutputDebugStringW を使っています。

COM の特徴としては「スクリプトから呼び出せる」すなわち「デュアルインターフェイス (dual interface) を持つ」あるいは 「IDispatch インターフェイスを実装する」ということがあげられます。 (COM なら何でもスクリプトから呼び出せるわけでは無いのです。)

では、このようにスクリプティングから呼び出せるような簡単な COM コンポーネントはどのようにすれば簡単に作れるでしょうか。

Visual Studio のウィザードを利用すると簡単に、全部手で書いたら面倒くさいコードを作ることができます。 その手順を以下に示します。

ATL コンポーネントウィザードを利用して COM コンポーネントを作る方法

新規プロジェクトを作ります。プロジェクトの種類は ATL プロジェクト です。ここでは "KeicodeTest.DebugTrace" というプログラム識別子を持つコンポーネントを作るので、 新規プロジェクトの名前は KeicodeTest にします。(この結果、KeicodeTest.dll が出来ます)

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

コンポーネントのタイプは DLL を選びます。COM+ 1.0 をサポートする (Support COM+ 1.0) をチェックしておきます。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

完了 (Finish) をクリックします。プロジェクトはこれで完成です。

次に、このプロジェクトにクラスを追加します。プロジェクトメニューのクラスを追加...を選択します。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

追加するクラスの種類は ATL COM+ 1.0 コンポーネント にして、追加 (Add) します。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

すると、ウィザードが始まります。下画面の左上の Short nameDebugTrace と入力してください。 他のフィールドはこの文字を元にいい感じで補完してくれます。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

このまま 完了 (Finish) を押してもいいのですが、一応、COM+ 1.0 のオプションをみておきましょうか。 確かにここでインターフェイスが デュアル (dual) となっていることが確認できると思います。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

完了 (Finish) を押してウィザードを終了してください。

ここまでで、さっきのウィザードで入力された文字を良くみるとわかるのですが、 IDebugTrace インターフェイスを持つ、KeicodeTest.DebugTrace コンポーネントが出来上がりました。

ただし、この時点では中身は空っぽです。

次に、IDebugTrace インターフェイスに文字列を受け取る Write メソッドを追加します。

Visual Studio のクラスビューのなかで、IDebugTrace インターフェイスで右クリックします。 コンテキストメニューの 追加 (Add) から メソッドを追加 (Add Method)... を選択します。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

以下のようにメソッド名として Write、パラメータの型として BSTR、パラメータ名として bstrMsg をそれぞれ入力して、 追加 (Add) をクリックします。アトリビュートは in です。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

完了 (Finish) をクリックします。

すると、IDebugTrace インターフェイスの定義に Write メソッドが追加されているはずです。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

インターフェイスの定義ではなく、その実装部分 (CDebugTrace クラス) にも Write メソッドが追加されているはずです。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

メソッド上で右クリックして、Go To Definition を選択すると、メソッドの実装部分にジャンプします。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

ウィザードで作られたコードは次のように、何もせずに S_OK という HRESULT コードを返すだけです。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

Write メソッドを次のように書き換え、OutputDebugStringW を呼び出します。

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

ちなみに、BSTR は OLECHAR* なのですが、OLECHAR は WCHAR であるため、BSTR は WCHAR* となるので、 キャスト可能です。(しかしながら、BSTR は文字列の長さを持つので、WCHAR* から BSTR への変換はただのキャストでは間違いです)

以上、ここまででプロジェクトをビルドします。エラー無くビルドできるはずです。

実行例

冒頭に示した VBScript コードを実行すると、以下のようにデバッグトレースが確認できるはずです。

例えば、VBScript を test.vbs とすると、コマンドプロンプトから次のように実行できます。

> cscript test.vbs

Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法

以上、ここではウィザードを使って COM コンポーネントを作りました。

しかしこの他、COM のアトリビュートプログラミングを利用して簡単にデュアルインターフェイスの COM コンポーネントを書くこともできます。 下記、関連記事も併せてご覧ください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説