Click here to visit our sponsor

ActiveX クライアント


ここは...

ここでは、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 を実行できないから?)


おわりに

このページの満足度は・・・

素晴らしい!
まあまあ、良いかも
自己満足感がよくわかるページですね
まったくもって説明不足


Visual Basicページトップ

HOME

兄弟ページ 姉妹ページ
Click here to visit our sponsor