Essential COM

IUnknown

DuplicatePointer DestroyPointer , AddRef Release IUnknown , , . , . AddRef/Release , , .

(Component Object Model Specification) . - C++. :

  1. , AddRef .
  2. , , Release, , .
  3. AddRef Release , .

, ( , ). , AddRef Release, . , , 8500 14.4 / , .

, , , AddRef Release. , AddRef:

  • 1. .
  • 2. [out] [in, out] .
  • A3. (physical result) .
  • 4. .
  • , Release:

  • R1. .
  • R2. .
  • R3. [in,out] , . , [out] .
  • R4. .
  • R5. , .
  • , , [in]:

  • S1. [in]- , AddRef Release, , , .
  • , , .

    , , , :

    void GetObject([out] IUnknown **ppUnk);

    , :

    void UseObject([in] IUnknown *pUnk);

    , . , , :

    void GetAndUse(/* [out] */ IUnknown ** ppUnkOut) { IUnknown *pUnk1 = 0, *pUnk2 = 0; *ppUnkOut =0; // R3 // get pointers to one (or two) objects // ( ) GetObject(&pUnk1); //A2 GetObject(&pUnk2); //A1 // set pUnk2 to point to first object // pUnk2, if (pUnk2) pUnk2->Release(): //R1 if (pUnk2 = pUnk1) pUnk2->AddRef(): //A1 // pass pUnk2 to some other function // pUnk2 - UseObject(pUnk2); //S1 // return pUnk2 to caller using ppUnkOut parameter // pUnk2 , // ppUnkOut if (*ppUnkOut = pUnk2) (*ppUnkOut)->AddRef(); // A2 // falling out of scope so clean up // if (pUnk1) pUnkl->Release(); //R2 if (pUnk2) pUnk2->Release(); //R2 }

    , A2 , . GetObject , GetObject . , GetObject AddRef [out]. , ppUnkOut, AddRef .

    AddRef Release, . AddRef, Release 32- . AddRef Release. , , , , , , .

    , , Release . Release , . . , Release , , . , Release , AddRef, . , , , , , . (released) , , , Release:

    inline void SafeRelease(IUnknown * &rpUnk) { if (rpUnk) { rpUnk->Release(); rpUnk = 0; // rpUnk passed by reference // rpUnk, } }

    , . , , .

    , AddRef Release, . GetAndUse, , . , , , . , return , , (unhandled) C++, , , . , , , C++. , , , . - , Release .

    Категории