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


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

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

Как правило, методы клиента могут вызываться только из потока, в котором был создан клиент. Как правило, методы, вызываемые из неправильного потока, немедленно завершаются ошибкой. Важное исключение для этого правила — метод 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 );

#B0 Важно. Интерфейсы IDebug*, такие как интерфейс IDebugEventCallbacks, хотя и похожи на COM, не являются настоящими интерфейсами COM. Вызов этих интерфейсов из управляемого кода — это неподдерживаемый сценарий. Такие проблемы, как сборка мусора и владение потоками, приводят к нестабильности системы при вызове интерфейсов с управляемым кодом.