次の方法で共有


プロファイル 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 に設定します。

解説

呼び出し元が割り当てるバッファを使用するには、次の 2 つの方法があります。

  • 1 回引き渡し方式 : 返されるすべての要素を格納するのに十分な大きさであると予想されるバッファを割り当てます。バッファが小さすぎる場合にバッファを再割り当てできるようにしておく必要があります。そのようにしないと、データが切り捨てられる場合があります。

  • 2 回引き渡し方式 : この方法では、メソッドを 2 回呼び出します。最初の呼び出しでは長さ 0 の InfoBuffer パラメータを渡して、適切なバッファのサイズを取得します。その後、バッファのサイズを pcBufferMax で返された値に設定し、関数を再度呼び出します。

最初の方式の方が高速で、動的な割り当てが行われません。ただし、バッファが情報を格納するのに十分な大きさでない場合は、バッファの再割り当てが必要になることがあります。

2 番目の方式は、2 回の呼び出しと動的な割り当てが伴うので遅くなります。たとえば、アプリケーションのドメイン名に関するクエリ情報が要求されたものとします。このメソッドから制御が戻った後で、InfoBuffer がアプリケーション ドメインの完全名を格納できるサイズであることを確認する必要があります。これを行うには、pcBufferMax が指している値を cBufferSizeStart パラメータの値と比較します。pcBufferMax の指す値が cBufferSizeStart の値より大きい場合は、InfoBuffer バッファの割り当てを増やし、cBufferSizeStart を新しい大きいサイズに更新して、メソッドを再度呼び出します。

参照

その他の技術情報

プロファイル API の共通機能

プロファイリングの概要

プロファイル (アンマネージ API リファレンス)