Compartir a través de


Uso de objetos de cliente

Para obtener información general sobre el rol de los objetos de cliente en la interacción con el motor del depurador, consulte Objetos de cliente.

En general, solo se puede llamar a los métodos de un cliente desde el subproceso en el que se creó el cliente. Normalmente, los métodos a los que se llama desde el subproceso incorrecto producirán un error inmediatamente. La excepción notable a esta regla es el método CreateClient; Se puede llamar a este método desde cualquier subproceso y devuelve un nuevo cliente que se puede usar en el subproceso desde el que se llamó. Otras excepciones se documentan en la sección de referencia.

El método GetIdentity devuelve una cadena que describe un objeto de cliente o se puede escribir en el flujo de salida del motor mediante OutputIdentity.

COM Interfaces

La API del motor de depurador contiene varias interfaces COM como; implementan la interfaz IUnknown .

El cliente implementa las interfaces descritas en la sección Interfaces del motor de depuración (aunque no necesariamente en la versión más reciente). Puede usar el método COM IUnknown::QueryInterface para obtener cada una de estas interfaces de cualquiera de las demás.

Los clientes implementan la interfaz COM IUnknown y lo usan para mantener los recuentos de referencias y la selección de la interfaz. Sin embargo, los clientes no son objetos COM registrados. El método IUnknown::AddRef se usa para incrementar el recuento de referencias en el objeto y el método IUnknown::Release se usa para disminuir el recuento de referencias. Cuando se llama a IUnknown::QueryInterface , se incrementa el recuento de referencias, por lo que cuando ya no se necesita un puntero de interfaz de cliente, se debe llamar a IUnknown::Release para disminuir el recuento de referencias.

El recuento de referencias se inicializará en uno cuando se cree el objeto de cliente mediante DebugCreate o DebugConnect.

Consulte el SDK de plataforma para obtener más información sobre cuándo se deben incrementar y disminuir los recuentos de referencia.

IUnknown::QueryInterface, DebugCreate y DebugConnect toman cada uno un identificador de interfaz como uno de sus argumentos. Este identificador de interfaz se puede obtener mediante el operador __uuidof . Por ejemplo:

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

Importante Las interfaces IDebug* como IDebugEventCallbacks , aunque COM como, no son API COM adecuadas. Llamar a estas interfaces desde código administrado es un escenario no admitido. Problemas como la recolección de elementos no utilizados y la propiedad del subproceso, provocan inestabilidad del sistema cuando se llama a las interfaces con código administrado.