何か創りたい。
http://toshirr.blog13.fc2.com/
* Toshi's Recess Room - Toshi Creates. - COM 備忘録
<< 2017/09 - 2017/10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 - 2017/11 >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ No. ]
[ 日時 : --/--/-- (--.) --:--:-- ]
[ カテゴリ : スポンサー広告 ]


COM 備忘録

備忘録っぽく残しておきます。同じ単語が続々流れて来ますがご了承。

QueryInterface メソッドは、インターフェイス ID とインターフェイス ポインタへのポインタを渡すと、
指定したインターフェイス ID によって識別される特定のインターフェイスを
渡したインターフェイス ポインタへ放り込んでくれます。
これは実際には、関数ポインタが入っているテーブルへのポインタへのポインタを
セットしているわけですが、そこらへんはコンパイラが適宜よろしく面倒を見ていますね。
pInterface->Method1()
このようなコードがあった場合コンパイラは、

「『変数 pInterface に格納されているポインタが指し示すアドレス』に格納された
 『関数ポインタが入っているテーブルへのポインタ』が指し示すアドレスを基点とし、
 『変数 pInterface の型になっているインターフェイスの定義に於いて
 Method1 が何番目に定義されているか』を元に、
 『Method1 への関数ポインタが格納されているアドレス』を相対的に割り出し、
 それによって Method1 を関数ポインタ経由で呼び出す」

というコードを出力するわけです。非常に助かります。
図にするともっと簡単なのですが、面倒なので割愛します。(ややこしいままですね...。)
COM は言語としてのサポートがあって初めて利用できるものともいえます。

さて、この例でいうと、
変数 pInterface には Method1 を実装している何らかのインターフェイスへの
インターフェイス ポインタが格納されているわけですが、これは CoCreateInstance API か、
既に存在するインターフェイスの QueryInterface メソッドを呼ぶなどして得たポインタですね。

しかし、ポインタは得るばかりでなく自分でセットしてやらなければならない場合があります。
IE コンポーネントからのイベントを受け取る DWebBrowserEvents2 インターフェイスなどです。
これはイベントが起きた際にコールバックしてもらえるように、
AtlAdvise API で依頼する際に必要になります。
この API には、自分で実装した DWebBrowserEvents2 インターフェイスへの
インターフェイス ポインタへのポインタを渡します。

その為に、まず関数ポインタを格納するテーブル、いわゆる配列を用意し、
そこに関数ポインタを格納、そしてその配列へのポインタを格納した変数も用意。
更にその変数へのポインタを格納した変数も用意、
最終的にこの変数へのポインタが渡されることになります。疲れます。
ここまでの処理をすることで、イベントを受け取ることが出来ます。

さて先日、このイベントを受け取るインターフェイスをクラスで実装出来ないかと述べました。
メソッドが利用する為のクラスの中で保持するべき変数も全て保持するとして、
更に関数ポインタを格納するテーブルやそのポインタなども
クラスの中に押し込める、というのも不可能ではないと思われます。

しかし次の、関数ポインタ経由でメソッドが呼ばれる段階でアウトです。
呼ばれるだけならいいのですが、そこで上記の
「メソッドが利用する為のクラスの中で保持するべき変数」にアクセスしようとした場合、
関数ポインタ経由であるが故に、呼ばれたメソッドが自分の属しているクラスの存在を
把握出来ない為、アクセス違反になってしまうのです。
そうするとグローバル領域に Function を定義してそのポインタをテーブルに格納し、
それを経由してクラスのメソッドを呼ぶという手段しかありません。

こういった話は ab.com コミュニティでも何度か挙がっています。
QueryInterface 等のキーワードで検索してみると出て来ます。

長々と書いてしまいました。

更に余談。
学校で Excel の授業。
担当の先生が関数の「引数」を「いんすう」と読んでいました。
なんか気になりました。
スポンサーサイト

[ No. 569 ]
[ 日時 : 2007/06/27 (Wed.) 23:56:59 ]
[ カテゴリ : プログラミング ]
[ コメント : 0 ]
[ トラック バック : 0 ]


コメント


コメントの投稿









トラック バック


トラック バック URI

http://toshirr.blog13.fc2.com/tb.php/569-b4d66c32


前後の記事

これ以降に書かれた記事 : あまり重要じゃないお知らせ
これ以前に書かれた記事 : の接続は出来たよう(BlogPet)

プロフィール

Toshi

  • Author:Toshi
  • 何かを創りたい Toshi の記録


ブログ内の検索


最近の記事


最近のコメント


最近のトラック バック


カレンダー

09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -


月別の記事


カテゴリ別の記事


RSS フィード


<< 2017/09 - 2017/10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 - 2017/11 >>
* Toshi's Recess Room - Toshi Creates. - COM 備忘録
http://toshirr.blog13.fc2.com/
(C) 2005 - 2009 Toshi, All Rights Reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。