계산 규칙 참조

기술 자료 번역 기술 자료 번역
기술 자료: 104138 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

구성 요소 개체 모델 참조 횟수를 통해 인터페이스의 수명이 제어됩니다. 인터페이스의 참조 횟수는 IUnknown에서 상속된 AddRef() 및 Release() 멤버 함수를 통해 조작할 수 있습니다. 인터페이스의 참조 횟수 및 Release() 메서드 감소시킵니다 AddRef() 구성원 증가시키는 것이. 인터페이스의 참조 횟수가 0으로 이동하는 한 가지 더 이상 해당 인터페이스에 대한 모든 유효한 포인터를 없습니다. 모든 개체의 인터페이스 참조 횟수가 0인 경우 해당 개체에 대한 포인터를 더 이상 없으므로 다음 개체가 해제될 수 없습니다.

추가 정보

계산 규칙 참조

다음은 참조 횟수 와야 합니다 (페이지 83 및 OLE 2.0 사양의 84 찍은) 규칙을 복사본입니다. 이 문서에서는 규칙을 명백하게 설명할 수 있도록 작은 코드 샘플은 추가되었습니다.

  1. 모든 새 복사본에 대한 인터페이스 포인터 연구() 'd, AddRef 있어야 하며 모든 인터페이스 포인터 소멸 연구() 제외 릴리스 합니다 위치 규칙 연속 그렇지 않으면 명백히.

    1. -Out 매개 변수를 함수에: 실제 매개 변수 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. 새 포인터를 점자나 "씬 공기" 벗어났습니다: 다른 소스에서 가져오는 새로 합성된 포인터에 초기 AddRef() 수행해야 아니라 내부 특별한 지식이 사용하여 인터페이스 포인터를 합성합니다 A 함수. 중요 이러한 루틴을 인스턴스 생성 루틴을, 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. 내부적으로 저장된 포인터를 복사본을 반환하는: 포인터가 반환된 일단 호출 수신자는 수명이 있는 포인터 내부적으로 저장된 복사본을 관련이 없는 개념은 있습니다. 따라서 호출 수신자는 이를 반환하기 전에 포인터가 복사 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. 코드 조각 부분에 기본 구조가 준비되어 및 인터페이스 포인터 두 개 이상 수명을 조사를 관계에 대한 특별한 지식이 AddRef()/Release() 수 쌍을 생략할 수.

    1. 매개 함수에: 실제 매개 변수로 함수에 전달된 인터페이스 포인터 있는 복사본이 있는 값을 초기화하는 데 사용되는 포인터가 중첩된 수명이. 따라서 실제 매개 변수가 참조 계산되지 별도로 필요가 없습니다.
            void function (LPOLEOBJECT lpOleObject)
            {
      
            // Can use lpOleObject in this function
            // without doing AddRef() and Release().
      
            }
      								
    2. Out 매개 변수를 함수의 반환 값을 포함하여: 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. 지역 변수: A 함수 구현이 명확하게 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, 각각 다른 포인터를 가진 두 개의 구성 요소가 포함된 특성을 일부 데이터 구조가 있습니다. 한 구성 요소 (A) 수명을 수명, 다른 (B) 를 포함하도록 알려진 다음 두 번째 구성 요소에서 포인터를 첫 번째 다시 A B) 에서 않는 참조가 계산되지 수 합니다. 그렇지 않으면 만들어집니다 주기 방지하는 적절한 비우는데 동작을 유지하는 데 중요한 경우가 많습니다.

속성

기술 자료: 104138 - 마지막 검토: 2003년 12월 3일 수요일 - 수정: 3.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft OLE 2.0
  • Microsoft OLE 4.0?을(를) 다음과 함께 사용했을 때
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 서비스 팩 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
    • the operating system: Microsoft Windows 2000
키워드:?
kbmt kbprogramming KB104138 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com