使用客户端对象

有关客户端对象在与调试器引擎交互中的角色的概述,请参阅 客户端对象

通常,只能从创建客户端的线程调用客户端的方法。 通常,从错误线程调用的方法将立即失败。 此规则的显著例外是 方法 CreateClient;此方法可以从任何线程调用,并返回可在调用该方法的线程中使用的新客户端。 参考部分记录了其他异常。

描述客户端对象的字符串由 GetIdentity 方法返回,或者可以使用 OutputIdentity 写入引擎的输出流。

COM 接口

调试器引擎 API 包含多个 COM 类似接口;它们实现 IUnknown 接口。

调试引擎接口部分中介绍的接口由客户端 (实现,但不一定是在最新版本) 实现的。 可以使用 COM 方法 IUnknown::QueryInterface 从任何其他接口获取其中每个接口。

客户端实现 IUnknown COM 接口,并使用它来维护引用计数和接口选择。 但是,客户端不是注册的 COM 对象。 方法 IUnknown::AddRef 用于递增对象的引用计数,方法 IUnknown::Release 用于递减引用计数。 调用 IUnknown::QueryInterface 时,引用计数递增,因此当不再需要客户端接口指针时,应调用 IUnknown::Release 来递减引用计数。

使用 DebugCreateDebugConnect 创建客户端对象时,引用计数将初始化为 1。

有关何时应递增和递减引用计数的详细信息,请参阅平台 SDK。

IUnknown::QueryInterfaceDebugCreateDebugConnect 各自采用接口 ID 作为其参数之一。 可以使用 __uuidof 运算符获取此接口 ID。 例如:

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

重要IDebugEventCallbacks 接口等 IDebug* 接口(尽管 COM 类似)不是适当的 COM API。 从托管代码调用这些接口是一种不支持的方案。 使用托管代码调用接口时,垃圾回收和线程所有权等问题会导致系统不稳定。