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


Использование клиентских объектов

Общие сведения о роли клиентских объектов при взаимодействии с подсистемой отладчика см. в разделе Клиентские объекты.

Как правило, методы клиента могут вызываться только из потока, в котором был создан клиент. Как правило, методы, вызываемые из неправильного потока, немедленно завершаются ошибкой. Заметным исключением из этого правила является метод CreateClient; Этот метод может вызываться из любого потока и возвращает новый клиент, который можно использовать в потоке, из которого он был вызван. Другие исключения описаны в справочном разделе.

Строка, описывающая объект клиента, возвращается методом GetIdentity или может быть записана в поток вывода подсистемы с помощью OutputIdentity.

Интерфейсы COM

API обработчика отладчика содержит несколько интерфейсов COM, таких как ; они реализуют интерфейс IUnknown .

Интерфейсы, описанные в разделе Интерфейсы модуля отладки , реализуются клиентом (хотя и не обязательно в последней версии). Вы можете использовать com-метод IUnknown::QueryInterface для получения каждого из этих интерфейсов из любого другого.

Клиенты реализуют COM-интерфейс IUnknown и используют его для поддержания количества ссылок и выбора интерфейса. Однако клиенты не являются зарегистрированным COM-объектами. Метод IUnknown::AddRef используется для увеличения числа ссылок в объекте, а метод IUnknown::Release — для уменьшения числа ссылок. При вызове метода IUnknown::QueryInterface количество ссылок увеличивается, поэтому, когда указатель клиентского интерфейса больше не требуется, следует вызывать IUnknown::Release для уменьшения числа ссылок.

Количество ссылок будет инициализировано в один при создании клиентского объекта с помощью DebugCreate или DebugConnect.

Дополнительные сведения о том, когда следует увеличивать и уменьшать количество ссылок, см. в разделе Пакет SDK для платформы.

IUnknown::QueryInterface, DebugCreate и DebugConnect принимают идентификатор интерфейса в качестве одного из своих аргументов. Этот идентификатор интерфейса можно получить с помощью оператора __uuidof . Пример:

IDebugClient * debugClient;
HRESULT Hr = DebugCreate( __uuidof(IDebugClient), (void **)&debugClient );

Важно Интерфейсы IDebug*, такие как интерфейс IDebugEventCallbacks , хотя и COM, не являются правильными ИНТЕРФЕЙСами COM API. Вызов этих интерфейсов из управляемого кода является неподдерживаемым сценарием. Такие проблемы, как сборка мусора и владение потоком, приводят к нестабильной работе системы при вызове интерфейсов с помощью управляемого кода.