Partilhar via


Usando objetos de cliente

Para obter uma visão geral da função dos objetos cliente na interação com o mecanismo do depurador, consulte Objetos do cliente.

Em geral, os métodos de um cliente podem ser chamados somente a partir do thread no qual o cliente foi criado. Normalmente, os métodos chamados a partir do thread errado falharão imediatamente. A exceção notável a esta regra é o método CreateClient; Esse método pode ser chamado de qualquer thread e retorna um novo cliente que pode ser usado no thread do qual foi chamado. Outras exceções estão documentadas na seção de referência.

Uma cadeia de caracteres que descreve um objeto cliente é retornada pelo método GetIdentity ou pode ser gravada no fluxo de saída do mecanismo usando OutputIdentity.

COM Interfaces

A API do mecanismo de depurador contém várias interfaces semelhantes a COM; elas implementam a interface IUnknown.

As interfaces descritas na seção Debug Engine Interfaces são implementadas pelo cliente (embora não necessariamente na versão mais recente). Você pode usar o método COM IUnknown::QueryInterface para obter cada uma dessas interfaces de qualquer uma das outras.

Os clientes implementam a interface IUnknown COM e usam-na para manter contagens de referência e seleção de interface. No entanto, os clientes não são objetos COM registados. O método IUnknown::AddRef é usado para incrementar a contagem de referência no objeto, e o método IUnknown::Release é usado para diminuir a contagem de referência. Quando IUnknown::QueryInterface é chamado, a contagem de referência é incrementada, portanto, quando um ponteiro da interface do cliente não é mais necessário, IUnknown::Release deve ser chamado para diminuir a contagem de referência.

A contagem de referência será inicializada para um quando o objeto cliente for criado usando DebugCreate ou DebugConnect.

Consulte o SDK da plataforma para obter mais informações sobre quando as contagens de referência devem ser incrementadas e diminuídas.

IUnknown::QueryInterface, DebugCreate e DebugConnect usam um ID de interface como um de seus argumentos. Este ID de interface pode ser obtido usando o operador __uuidof . Por exemplo:

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

Importante As interfaces IDebug*, como a interface IDebugEventCallbacks , embora semelhantes a COM, não são APIs COM adequadas. Chamar estas interfaces a partir de código gerido é um cenário não suportado. Problemas como a recolha de lixo e a gestão de threads levam à instabilidade do sistema quando as interfaces são chamadas com código gerido.