Condividi tramite


Chiamata di estensioni e funzioni di estensione

Per caricare una libreria di estensioni (o per ottenere un handle per una libreria di estensioni già caricata), usare AddExtension. Una libreria di estensioni può essere scaricata con RemoveExtension.

I comandi di estensione possono essere chiamati usando CallExtension.

Funzioni di estensione

Le funzioni di estensione sono funzioni esportate dalle librerie di estensioni. Possono usare qualsiasi prototipo di funzione e vengono chiamati direttamente usando i puntatori di funzione C.

Non sono comandi di estensione e non sono disponibili tramite i comandi del debugger. Le funzioni di estensione non possono essere chiamate in remoto; devono essere chiamati direttamente. Di conseguenza, non possono essere usati dai client di debug. Possono essere chiamati solo quando l'oggetto client si trova all'interno del motore host, quando non viene eseguito il debug in remoto o quando si usa un client intelligente.

Le funzioni di estensione vengono identificate nelle librerie di estensioni da "_EFN_" precedute dai nomi.

Per ottenere un puntatore a una funzione di estensione, usare GetExtensionFunction. Il tipo di puntatore alla funzione deve corrispondere al prototipo della funzione di estensione. La funzione di estensione può ora essere chiamata esattamente come qualsiasi altro puntatore a funzione in C.

Esempio

Se la funzione di estensione seguente è stata inclusa in una libreria di estensioni e caricata nel motore del debugger:

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

Può essere chiamato 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);
}