DuplicatePointer DestroyPointer , AddRef Release IUnknown , , . , . AddRef/Release , , .
(Component Object Model Specification) . - C++. :
, ( , ). , AddRef Release, . , , 8500 14.4 / , .
, , , AddRef Release. , AddRef:
, Release:
, , [in]:
, , .
, , , :
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 .