トップページ⇒tech
12コメント4KB

カスタムインターフェースの型情報

■ このスレッドは過去ログ倉庫に格納されています
0001IDispatchNGNG
「COMオブジェクトでカスタムインターフェースは型情報を
静的に持つため、型情報を動的にしか扱えないVisual Basicや
VBScriptなどのインタープリタ型の言語はカスタムインターフェースを
使用できない」という表現で "型情報を静的、動的" の意味が
いまいちよくわかりません。おわかりの方がいらっしゃいましたら
おしえていただけないでしょうか?
0002名無しさん@お腹いっぱい。NGNG
静的:直に呼ぶ
動的:Invoke()経由
0003名無しさん@お腹いっぱい。NGNG
VBがカスタムインターフェイスを扱えないってのは
少なくともVB5以降では嘘。
00041NGNG
2@`3さん、レスありがとうございます。

もう1つだけ質問させてください。

C でオブジェクトのメソッドを呼び出すときに

pIFoo->lpVtbl->Func1(pIFoo);

のようにインターフェースポインタ、vtable のポインタからメソッド名を指定して
呼び出しますが、メソッド名から関数ポインタを明示的に逆参照するにはどうしたらよいでしょうか?

CやC++ではもちろんこんな必要はありませんけど、フリーのインタプリタ型言語のHSPというもので
COMオブジェクトを扱おうと思っているのでこんな面倒なことになっています。

いまのところはvtableのポインタからアドレスを取得して、ここから4バイトごとに各メソッドへの
エントリポイントが格納されているとして使用したいメソッドが何番目かという情報をタイプライブラリを
見てなんとなく判断して呼び出しています。(QueryInterfaceなら1番目だからlpVtbl、
Releaseなら3番目だから lpVtbl + (4 * 2) 見たいな感じ)
通常のAPIでいう GetProcAddress のように、できればメソッド名からこれを逆参照したいのです。


0005名無しさん@お腹いっぱい。NGNG
ていうかそもそもそのようにメソッド名(文字列)を指定して
メソッドを呼ぶためにDispatchインターフェイスがある訳だろ。
すなおにCOMサーバ側でIDispatchを実装すれば良いだろう。
それともカスタムインターフェイスしかサポートしていない
出来合いのCOMサーバを使わなければならないという話なの?
0006>5NGNG
VBがカスタムインターフェイス使えるのに
どうしてIDispatchを実装する必要があるんだ?笑い
0007名無しさん@お腹いっぱい。NGNG
>>6
????
良く読めよ。5は4へのレスであって、この時点ではVBは
関係ないぞ。
0008名無しさん@お腹いっぱい。NGNG
C++の仮想関数呼び出し部分を作るってことかな
00091ですNGNG
>8さん
まさにその通りなんです。
vtableとメソッド名が関連付けられないんです。
C++だと2重間接参照とthisポインタはコンパイラが
処理してくれるんですよね。
0010名無しさん@お腹いっぱい。NGNG
某MLにも投げてなにげに2chカミングアウトしてないか?>>1
0011名無しさん@お腹いっぱい。NGNG
>カミングアウト coming-out
>[名]《略式》
>1(若い女性の)社交界デビュー.
>2 同性愛者であることの公表.

ってことは 1 は同性愛者か?
0012名無しさん@お腹いっぱい。NGNG
オキャクサン アオリ ヘタ ダメ。
■ このスレッドは過去ログ倉庫に格納されています