ICallIndirect
COM公式ドキュメント
従来の直接呼び出しではなく、呼び出し引数への間接参照を用いてオブジェクトを呼び出します。
解説(Remarks)
間接呼び出しを実際にどのように実行するかという詳細なセマンティクスは、ICallIndirect インターフェイス自体とは独立しており、インターフェイスの実装に固有です。たとえば、呼び出しインターセプターに含まれる ICallIndirect の実装では、適切な ICallFrame インスタンスを構築し、登録済みのシンクの ICallFrameEvents::OnCall を呼び出すことで、呼び出しを実行します。他の実装では、呼び出し引数に対して適切な加工を行った後、実際の特定のオブジェクト (通常は、実装固有の手段によって事前に ICallIndirect に登録されたオブジェクト) に呼び出しを転送する場合もあります。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
呼び出しの引数への間接参照を用いて、インターフェイスのメソッドの 1 つを呼び出します。
| phrReturn | HRESULT* | out | メソッドの呼び出しから返される値。 |
| iMethod | DWORD | in | 呼び出すメソッドの番号。 |
| pvArgs | void* | in | 呼び出しに使用するスタックフレームへのポインター。このスタックフレームの正確な表現の詳細は、プロセッサアーキテクチャに固有です。 |
| cbArgs | DWORD* | out | この呼び出しの引数をスタックから取り除くために、スタックからポップするバイト数。 |
戻り値
このメソッドは次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| 予期しないエラーが発生しました。 |
呼び出しフレームから、インターフェイスメソッドに関する情報を取得します。
| iMethod | DWORD | in | メソッド番号。 |
| pInfo | CALLFRAMEINFO* | out | 指定したメソッドに関する情報を格納する CALLFRAMEINFO 構造体へのポインター。 |
| pwszMethod | LPWSTR* | out | メソッド名。このパラメーターは省略可能です。 |
戻り値
このメソッドは次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| 予期しないエラーが発生しました。 |
解説(Remarks)
返される情報は、呼び出しフレームの実際の現在の内容ではなく、メソッドシグネチャの解析のみに基づく静的な解析結果であり、動的な解析結果ではありません。たとえば、静的解析ではこのメソッドが in 方向のインターフェイスを持つ可能性があると示されても、共用体のスイッチなどの理由により、実際の特定の呼び出しではそのようなインターフェイスがまったく存在しない場合があります。このメソッドは ICallFrame の GetInfo メソッドおよび GetNames メソッドと同等ですが、情報を取得するために実際に呼び出しを行う必要がありません。
メソッドの呼び出しから復帰するために、スタックからポップすべきバイト数を取得します。
| iMethod | DWORD | in | メソッド番号。 |
| cbArgs | DWORD* | out | 呼び出しの引数をスタックから取り除くために、スタックからポップするバイト数。 |
戻り値
このメソッドは次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| 予期しないエラーが発生しました。 |
この ICallIndirect 実装がサポートするインターフェイス ID を取得します。
| piid | GUID* | outoptional | インターフェイスへのポインター。このパラメーターは省略可能です。 |
| pfDerivesFromIDispatch | BOOL* | outoptional | インターフェイスが IDispatch から派生しているかどうかを示します。このパラメーターは省略可能です。 |
| pcMethod | DWORD* | outoptional | インターフェイス内のメソッド数を受け取ります。 |
| pwszInterface | LPWSTR* | out | 利用可能な場合、インターフェイス名を受け取ります。 |
戻り値
このメソッドは次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| 予期しないエラーが発生しました。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ICallIndirect "{D573B4B1-894E-11D2-B8B6-00C04FB9618A}" #usecom global ICallIndirect IID_ICallIndirect "{}" #comfunc global ICallIndirect_CallIndirect 3 var,int,sptr,var #comfunc global ICallIndirect_GetMethodInfo 4 int,var,var #comfunc global ICallIndirect_GetStackSize 5 int,var #comfunc global ICallIndirect_GetIID 6 var,var,var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ICallIndirect "{D573B4B1-894E-11D2-B8B6-00C04FB9618A}" #usecom global ICallIndirect IID_ICallIndirect "{}" #comfunc global ICallIndirect_CallIndirect 3 sptr,int,sptr,sptr #comfunc global ICallIndirect_GetMethodInfo 4 int,sptr,sptr #comfunc global ICallIndirect_GetStackSize 5 int,sptr #comfunc global ICallIndirect_GetIID 6 sptr,sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。