Использование клиентских объектов
Общие сведения о роли клиентских объектов при взаимодействии с подсистемой отладчика см. в разделе Клиентские объекты.
Как правило, методы клиента могут вызываться только из потока, в котором был создан клиент. Как правило, методы, вызываемые из неправильного потока, немедленно завершаются ошибкой. Заметным исключением из этого правила является метод 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. Вызов этих интерфейсов из управляемого кода является неподдерживаемым сценарием. Такие проблемы, как сборка мусора и владение потоком, приводят к нестабильной работе системы при вызове интерфейсов с помощью управляемого кода.