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