0

COM 公開インターフェイス メソッドの vtable からアドレスを読み取って、co-class 関数を呼び出す必要があります。アドレスを読み取る一般的な方法が必要です。

次に、TLB から収集した特定のアドレス (NOT KNOWN) 引数 (パラメーター) と名前を持つ関数を呼び出す必要があります。そのアドレスが、これから呼び出す関数名にどのように対応するか。

このためには、関数アドレスを保持している vtable をトラバースする必要があります。最後に、関数アドレスをその関数の名前に対応させる必要があります。これは、私は知りません。どのように?同じ名前の複数の関数が vtable に表示される場合があります (オーバーロードの場合)。その場合、関数名とそのアドレスを区別する必要があります。取り組む方法は?よろしくウスマン


敬具サー.!!

特定のCOM ExeまたはCOM DLLのすべての関数シグネチャを引き出してグリッドまたはユーザーへのインターフェイスに表示する必要があるユニットテストフレームワークを設計しているため、後でそのリストから特定の関数シグネチャを選択することで、彼/彼女その関数に引数(パラメーターとしてのデータ)を提供した後、その関数を実行できます。これはすべて実行時に動的に行われ、実行時にユーザーが必要とする関数が呼び出されます。

これは、さまざまな方法で実現できます。

TLB (タイプ ライブラリ) を提供することで、すべての関数シグネチャを取得し、すべてのシグネチャをグリッド コントロールまたはツリー コントロールに表示できます。2 番目のステップは、データを提供して実行時にこれらの関数を呼び出すことです。呼び出しには、データと関数のアドレス (または名前) が必要です。ユーザーからデータを取得するGUIパネルまたはコントロールがあり、そのデータが引数になります。

今、私が以前に投稿した本当の問題が発生します。コクラスによって実装された COM コンポーネントによって公開されたそのインターフェイスの関数/メソッドへの呼び出し。これには、 component によって公開されたインターフェイスの vtable をたどり、その関数のアドレスを見つけてから、関数として呼び出す予定のアドレスが本当にそれであるかを知る必要があります。したがって、これにはそのアドレスを関数名に変換する必要があり、文字列を比較して、ユーザーが署名を表示するツリー コントロールからクリックした関数名が本当にその関数名であるかどうかを判断します。

提案または推奨事項はありますか?

4

1 に答える 1

0

各関数に対してITypeInfo::GetFuncDescを呼び出すと、返される FUNCDESC 構造体に oVft メンバーの vtable インデックスが含まれます。インターフェイス vtable を void** にキャストし、それを単にインデックスとして使用します。

もちろん、なぜこれを行う必要があるのか​​ はわかりません:)

于 2010-03-12T15:10:34.427 に答える