COMのインターフェースは、ネイティブのC++言語からも、スクリプト言語からも利用できます。
まずこれらの呼び出し方法の概要をおさらいし、次にそれらを両立させる方法について説明します。
ネイティブC++
C++からCOMサーバにアクセスするには、
ゼロからのCOMの説明にあるように、
IUnknownを継承したインターフェースを定義し、
そのインターフェースを実装したcoclassを実装したCOMサーバを用意します。
多くのスクリプト言語は、IUnknownを継承したインターフェースを直接呼び出す機能を持っていません。
スクリプト言語
スクリプト言語からCOMサーバにアクセスするには、
オートメーションの説明にあるように、
IDispatchを実装したcoclassを用意し、
IDispatchを介してcoclassの備える機能を呼び出します。
IDispatchを用いたアクセスはC++からも可能ですが、
関数呼び出しのためにIDispatchによるメソッドIDの解決やVARIANT引数の準備といった煩雑な手順が必要になります。
また、IDispatchのメソッドを介した変数の型チェックなどを行ってから呼び出すため、
直接呼び出しと比べ呼び出しに時間がかかります。
C++とスクリプト言語の両立
このように、メソッドの直接呼び出しとIDispatchを介した呼び出しにはそれぞれ一長一短があります。
C++言語とスクリプト言語の双方から呼び出したいなら、
coclassがこれら2つの機能を備えていれば良いわけです。
2つの機能を同時に実現するには、COMサーバで、IUnknownではなくIDispatchを継承したインターフェースを実装します。
このようにすれば、
C++言語からはメソッドを直接呼び出すことができ、
スクリプト言語からはIDispatchを介してメソッドを呼び出せるようになります。
このようなインターフェースをデュアルインターフェースと呼びます。
ここでは、まず独自のデュアルインターフェースの定義方法について説明し、
その後、デュアルインターフェースを備えたcoclassの実装方法について説明していきます。
システムで定義されたデュアルインターフェースを利用すれば十分である場合は、
新しいインターフェースを定義せずに、既存のデュアルインターフェースを利用しても問題ありません。
関連ページ
COM/ActiveXの解説ページ 目次
次の項目: MIDL