現在オフラインです。再接続するためにインターネットの接続を待っています

参照カウント規則

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:104138
概要
コンポーネントのオブジェクト モデルでは、インタ フェースの有効期間が制御されます。参照をカウントするをします。インターフェイスの参照カウントです。AddRef() し Release() メンバー関数からの操作IUnknown から継承します。インタ フェースの AddRef() メンバーをインクリメントします。参照カウントをし、Release() メソッドにします。1 回、インターフェイスのリファレンス カウントが 0 になる、なくなった任意そのインターフェイスへの有効なポインター。すべての参照をカウントする場合は、オブジェクトのインターフェイスは 0、のでオブジェクトを解放することができますし、そのオブジェクトへのポインターはされなくがあります。
詳細

参照カウント規則

カウント (規則への参照のコピーを次に示しますページから 83、84 の OLE 2.0 仕様にする必要があります。後に。この資料で小規模なコードのサンプルが追加されましたルールを明確にします。

  1. すべての新しいコピーへのインターフェイス ポインターを () と、AddRef をする必要があり、すべて破棄へのインターフェイス ポインターをリリースを () の場合をする必要があります。場所後のルール明示的にそれ以外の場合ことを除く。

    1. 入出力パラメーターを関数にAddRef() 呼び出し元を必要があります、。実パラメーターは、呼び出される側でそのままなので () のリリースをしますout-value の上に格納されます。
            LPOLEOBJECT lpObject;         .         .  // Get pointer to IOleObject.         .      LPVIEWOBJECT lpView = lpObject;      lpObject->AddRef()      // GetViewObject is a theoretical function that takes a      // pointer to anything derived from IUnknown, and then      // returns a pointer to IViewObject in the same variable      // passed as the parameter. The AddRef() above is needed so      // that the original pointer to IOleObject is not freed.      GetViewObject(lpView);								
    2. グローバル変数を取得します。: インターフェイスのローカル コピーポインターを既存のグローバル ポインターのコピーを取得変数と呼ばれるためにのカウントへの参照を個別にする必要があります。グローバルの中、ローカルのコピー機能が壊れる可能性があります。コピーはまだ生きています。
            void function()      {      // Get a pointer to IOleObject from a global variable.      LPOLEOBJECT lpOleObject = glpObject;      // This AddRef() is needed so that the interface      // pointed to by the global variable, glpObject,      // does not get released by a different part of      // the applications code.      lpOleObject->AddRef();         .         . // use lpOleObject;         .      lpOleObject->Release();      }								
    3. 新しいポインターの「外に薄い空気の中」の合成: A 関数を内部では、インターフェイス ポインターを合成します。その他のソースから取得するのではなく、知識をする必要があります。初期の AddRef()、新しく合成されたポインターの操作を行います。インスタンスの作成のようなルーチンの重要な例を含めるIUnknown::QueryInterface を実装しているため、など。
            STDMETHDOIMP IUnknown::QueryInteface( REFIID iidInterface,                                         LPVOID FAR *ppvObj)      {      *ppvObj = NULL;      SCODE sc = E_NOINTERFACE;      if (iidInterface == IUnknown)          {          *ppvObj = this;          // This AddRef() is needed because a new pointer          // was just created.          AddRef();         sc = S_OK;          }      return ResultFromScode(sc);      }								
    4. 内部に格納されたポインターのコピーを取得します。: 1 回、返されたポインター、呼び出し先アイデア方法では、有効期間の内部に格納されたコピーに関連していますがポインターです。したがって、呼び出し先 AddRef() をポインターをコピーする前にする必要があります。取得します。
            // m_lpOleObject is a private member variable of a C++ class.      // GetOleObject is a member function to return access to this      // pointer.      void GetOleObject (LPVOID FAR *ppObject)      {          *ppObject = m_lpOleObject;          // This AddRef() is needed due to this rule.          m_lpOleObject->AddRef();       }								
  2. コードについての特別な知識、リレーションシップの開始し、2 つの存続期間の終わりまたは AddRef()/Release() へのインターフェイス ポインターの複数のコピーが可能除外するには、[組み合わせ] をクリックします。

    1. パラメーターを関数に: インターフェイス ポインターのコピー実関数にパラメーターが渡されます、ためにポインターの有効期間値を初期化します。したがって、実際のパラメーター必要はありません。参照を個別にカウントします。
            void function (LPOLEOBJECT lpOleObject)      {      // Can use lpOleObject in this function      // without doing AddRef() and Release().      }								
    2. アウト パラメーターなど、関数からの戻り値。 設定しますout パラメーターは関数自体がルール 1 必要があります、インターフェイス ポインターのコピーを安定しました。[終了]、ポインターを解放するための責任を転送してから、呼び出し先は呼び出し元にします。このため、out パラメーターはなくてください。参照カウントします。
            LPVIEWOBJECT lpView;      HERROR hErr = lpOleObject->QueryInterface(IID_IViewObject,                                                (LPVOID FAR *)lpView);      if (hErr = NOERROR)          {          // The QueryInterface succeeded. lpView does not have          // to be AddRef()'d because it has already been done          // by the QueryInterface method.          }								
    3. ローカル変数関数の実装が明らかにしました。omniscient 知識のそれぞれのポインターの有効期間変数は、スタック フレーム上に割り当てられています。そのために使用できます。AddRef()/Release() の冗長ペアを省略するのには、このナレッジです。
            void function()      {      LPOLEOBJECT lpTempObject;         .         .         .      lpTempObject = lpObject;         .         .  // lpTempObject can be used         .  // without reference counting as long as         .  // it is known that the lifetime of lpObject         .  // outside of this function call.         .      }								
    4. Backpointers: 一部のデータ構造の性質であります。A と B、それぞれへのポインターを持つ 2 つのコンポーネントが含まれている、他の。1 つのコンポーネント (A) の有効期間が含まれているがわかっている場合他の (B) し、2 つ目のポインターの有効期間コンポーネントに戻る (B a) から参照する必要はありませんカウントします。多くの場合、それ以外の場合になるサイクルを回避します。作成、適切な解放を保持することが重要です。動作します。
2.00 3.50 4.00

警告: この記事は自動翻訳されています

プロパティ

文書番号:104138 - 最終更新日: 06/30/2011 05:52:00 - リビジョン: 6.0

  • kbprogramming kbmt KB104138 KbMtja
フィードバック