Chamando extensões e funções de extensão

Para carregar uma biblioteca de extensões (ou para obter um identificador para uma biblioteca de extensão já carregada), use AddExtension. Uma biblioteca de extensões pode ser descarregada com RemoveExtension.

Os comandos de extensão podem ser chamados usando CallExtension.

Funções de extensão

Funções de extensão são funções exportadas por bibliotecas de extensão. Eles podem usar qualquer protótipo de função e são chamados diretamente usando ponteiros de função C.

Eles não são comandos de extensão e não estão disponíveis por meio de comandos de depurador. As funções de extensão não podem ser chamadas remotamente; eles devem ser chamados diretamente. Portanto, eles não podem ser usados na depuração de clientes. Eles só podem ser chamados quando o objeto cliente está dentro do mecanismo de host – quando não está depurando remotamente ou ao usar um cliente inteligente.

As funções de extensão são identificadas em bibliotecas de extensão pelo "_EFN_" anexado aos nomes.

Para obter um ponteiro para uma função de extensão, use GetExtensionFunction. O tipo desse ponteiro de função deve corresponder ao protótipo da função de extensão. A função de extensão agora pode ser chamada como qualquer outro ponteiro de função em C.

Exemplo

Se a seguinte função de extensão foi incluída em uma biblioteca de extensões e carregada no mecanismo de depurador:

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

Ele pode ser chamado usando:

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);
}