4

C++ クラスの仮想テーブルは、定義された仮想関数の数に依存します。実行時に v-table サイズの上限を取得する方法について何か考えはありますか?

オブジェクトへのポインターがあるとします。ヘッダー ファイルからパブリック仮想関数を知っていますが、保護された/プライベート仮想関数がいくつあるかはわかりません。

私の考えの 1 つは、次のようになるまで、vtable に沿って順番に読み下げることです。

  1. アクセス違反があり、これが vtable サイズの上限になる可能性があります。
  2. NULL です (ただし、NULL は純粋な仮想関数になることもあります)。

編集:

以前、ここで質問があります: C++ COM Object Hotpatching?

私は満足のいく答えを得ていません。したがって、vtable ポインターをハックする必要がある自分自身の方法を考えます。

私がやりたいことは、実行時に c++ オブジェクトに変数を追加することです。オブジェクトについて私が知っている唯一のことは、それが vtable ポインターを持っているということです。そのフィールドを追加するために、その vtable のコピーを保存する別の場所に vtable ポインターをポイントする予定です。そして、この新しい vtable の上流に、追加した変数を保存します。それが私が考えることができる唯一の解決策です。

COM オブジェクトの場合、ラッピング ソリューションは安全ではありません。オブジェクトに多くのインターフェイスがあり、queryInterface が呼び出されると、問題が発生します。

また、新しい変数をマップに保持するという考えには、変数にアクセスするたびにマップを読み取る必要があります。

4

0 に答える 0