ここでは、ActiveX に関して、思った事を記しています。
(クライアント側)
カスタムインターフェイスとは、ActiveX では Implements で実装するやつです。
クライアント側なら、普通に使ってるやつです。
Dim objDisp As Object
Dim objCustom As IMyCustom
Set objDisp = New Custom
Set objCustom = objDisp
この例では、ディスパッチインターフェイス(Object型)より、
カスタムインターフェイスを取り出しています。
ディスパッチより高速なので、好んで使うようにしたい。
Dim objUnk As IUnknown
Set objCustom = objUnk
より洗練なものにしたいなら、こっち。
また、デフォルトインターフェイス以外のインターフェイスへの接続も同様に行えます。
(ただし、タイプライブラリを公開しているインターフェイスのみ)
ここで、バインディングのまとめ
Object 型へのアクセス | IDispatch.GetIDsOfNames を実行して IDispatch.Invoke | 実行時バインディング (レイトバインディング) |
| タイプライブラリを参照 | オブジェクトがディスパッチしか持たない場合、 事前情報の DISPID により IDispatch,Invoke | 事前バインディング (アーリーバインディング) |
| タイプライブラリを参照 | オブジェクトがカスタムインターフェイスを持つ場合、 v-table でのアクセス (ディアルインターフェイスもこれ) | 関数テーブルバインディング |
(レイトバインディングは、CallByName による実行と同じ)
参考: バインディングが ActiveX コンポーネントのパフォーマンスに与える影響 (MSDN)
さて、調子にのって、コンポーネント側のメソッドの引数を、
カスタムインターフェイスにしてみました。
(これは VC でしました)
IDL はこんな感じ
HRESULT MyMethod([in]IMyCustom* pInterface);
クライアントの VB 側で呼び出してみました。
Dim objCustom As IMyCustom
...
objComp.MyMethod (objCustom)
実行結果は、
実行時エラー 438
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
あれっ、なぜメソッドはダメ?
・・・色々試したら、次ので出来ました。
Dim objCustom As IMyCustom
...
objComp.MyMethod (CVar(objCustom))
Variant でくるんでみました。
理由は知らないが、まぁ 出来たからいいか。
(Set を実行できないから?)