分析 API 中由调用方分配的缓冲区

更新:2007 年 11 月

采用调用方分配的缓冲区的 ICorProfilerInfo 方法通常符合以下签名。

HRESULT GetBuffer
(
    [in]  /* Some query information (for example, a name).*/,
    [in]  ULONG32 cBufferSizeStart,
    [out] ULONG32 *pcBufferMax,
    [out] /* TYPE */ InfoBuffer[] 
);

这些方法始终按如下方式运行:

  • cBufferSizeStart 参数指定缓冲区中分配的元素数目。此值表示由此方法的调用方分配的缓冲区的大小。

  • pcBufferMax 参数设置为可用元素的总数。该方法返回后,pcBufferMax 将设置为原本应该返回的最大元素数目,而不是实际返回的元素数目。因此,pcBufferMax 与调用方分配的缓冲区的实际大小无关。

  • InfoBuffer 参数指定调用方分配的缓冲区。它由此方法的调用方创建。其大小由 cBufferSizeStart 指定。该方法返回后,此缓冲区中将填充尽可能多的元素。可用的元素可能比可放入缓冲区中的元素多。如果 InfoBuffer 为 Null,则 cBufferSizeStart 必须为 0。如果返回了任何元素,方法将返回 S_OK,并将 pcBufferMax 设置为可用元素的总数。

备注

可采用两种方法来处理调用方分配的缓冲区:

  • 单遍方法:分配一个您认为大小足以包含所有返回的元素的缓冲区。如果缓冲区证实太小,要准备好重新分配缓冲区。否则,数据将可能被截断。

  • 双遍方法:以交替方式调用方法两次。第一次使用长度为零的 InfoBuffer 参数调用以获取正确的缓冲区大小。然后,将缓冲区大小设置为 pcBufferMax 中返回的值,并再次调用函数。

第一种方法更快,并可避免动态分配。但是,如果缓冲区大小不足以包含信息,您可能需要重新分配缓冲区。

第二种方法较慢,因为它牵涉到两次调用和动态分配。例如,假定请求的查询信息针对的是应用程序域的名称。此方法返回后,您必须验证 InfoBuffer 是否足够大以包含应用程序域的完整名称。为此,请将 pcBufferMax 指向的值与 cBufferSizeStart 参数的值进行比较。如果 pcBufferMax 指向大于 cBufferSizeStart 的值,请分配更大的 InfoBuffer 缓冲区,用新的、更大的大小更新 cBufferSizeStart,然后再次调用该方法。

请参见

其他资源

分析 API 中的常见功能

分析概述

分析(非托管 API 参考)