【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

vtable

COMのバイナリ構造とC++の関係を確認するため、vtableのメモリレイアウトを調べました。

  1. 仮想ではないメンバ関数はsizeofに影響しません。
  2. 仮想関数がない場合、インスタンスへのポインタからメンバ変数が入っています。
  3. 仮想関数がある場合、インスタンスへのポインタにはvtableへのポインタが入っていて、その次にメンバ変数が入っています。
  4. 継承するとvtableがあればポインタは差し替えられ、メンバ変数は後ろに追加されます。
  5. 仮想関数コールはvtableを読むラッパーを経由します。

手動呼び出し

COMのメモリレイアウトを理解するため、なるべく既存のマクロを使わないでC言語から呼び出してみました。

手軽にCOMのサンプルを作る方法が見当たらなかったので、以下の Project1.dll を使わせていただきました。

続きを読む