Appel d’extensions et de fonctions d’extension

Pour charger une bibliothèque d’extensions (ou pour obtenir un handle pour une bibliothèque d’extensions déjà chargée), utilisez AddExtension. Une bibliothèque d’extensions peut être déchargée avec RemoveExtension.

Les commandes d’extension peuvent être appelées à l’aide de CallExtension.

Fonctions d’extension

Les fonctions d’extension sont des fonctions qui sont exportées par les bibliothèques d’extensions. Ils peuvent utiliser n’importe quel prototype de fonction et sont appelés directement à l’aide de pointeurs de fonction C.

Il ne s’agit pas de commandes d’extension et ne sont pas disponibles via les commandes du débogueur. Les fonctions d’extension ne peuvent pas être appelées à distance ; ils doivent être appelés directement. Par conséquent, ils ne peuvent pas être utilisés à partir du débogage de clients. Ils ne peuvent être appelés que lorsque l’objet client se trouve à l’intérieur du moteur hôte, qu’ils ne déboguent pas à distance ou qu’ils utilisent un client intelligent.

Les fonctions d’extension sont identifiées dans les bibliothèques d’extensions par le « _EFN_ » ajouté à leurs noms.

Pour obtenir un pointeur vers une fonction d’extension, utilisez GetExtensionFunction. Le type de ce pointeur de fonction doit correspondre au prototype de la fonction d’extension. La fonction d’extension peut désormais être appelée comme n’importe quel autre pointeur de fonction en C.

Exemple

Si la fonction d’extension suivante a été incluse dans une bibliothèque d’extensions et chargée dans le moteur de débogueur :

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

Il peut être appelé à l’aide de :

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