拡張機能と拡張機能関数の呼び出し

拡張ライブラリを読み込む (または既に読み込まれている拡張ライブラリのハンドルを取得する) には、AddExtension を使用します。 拡張ライブラリは RemoveExtension を使用してアンロードできます。

拡張コマンドは、CallExtension を使用して呼び出すことができます。

拡張関数

拡張関数 は、拡張ライブラリによってエクスポートされる関数です。 任意の関数プロトタイプを使用でき、C 関数ポインターを使用して直接呼び出せます。

これらは拡張機能コマンドではなく、デバッガー コマンドからは使用できません。 拡張関数をリモートで呼び出すことはできません。これらは直接呼び出す必要があります。 そのため、デバッグ クライアントからは使用できません。 これらは、クライアント オブジェクトがホスト エンジン内にある場合 (リモートでデバッグしない場合、またはスマート クライアントを使用している場合) にのみ呼び出すことができます。

拡張関数は、拡張機能ライブラリ内では、名前の先頭に "_EFN_" が付加されることで識別されます。

拡張関数へのポインターを取得するには、GetExtensionFunction を使用します。 この関数ポインターの型は、拡張関数のプロトタイプと一致する必要があります。 これでこの拡張関数を、C の他の関数ポインターと同様に呼び出すことができます。

以下の拡張関数が拡張ライブラリに含まれ、デバッガー エンジンに読み込まれた場合:

HRESULT CALLBACK
_EFN_GetObject(IDebugClient * client, SomeObject * obj);

以下を使用して呼び出される可能性があります:

typedef ULONG (CALLBACK * GET_OBJECT)(IDebugClient * client, SomeObject * obj);



HRESULT status = S_OK;
GET_OBJECT extFn = NULL;
SomeObject myObj;

if (g_DebugControl->
        GetExtensionFunction(0,
                             "GetObject",
                             (FARPROC *) &extFn ) == S_OK &&
    extFn)
{
    status = (*extFn)(client, &myObj);
}