Поделиться через


Вызов расширений и функций расширений

Чтобы загрузить библиотеку расширений (или получить дескриптор для уже загруженной библиотеки расширений), используйте 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);
}