CComPtr 사용법 (회전)
COM 인터페이스 지침은 사용 과정에서 모든 사용자가 엄격하고 정확한 AddRef와Release를 필요로 하기 때문에 문제가 발생하면 대상이 정상적으로 풀리지 못하거나 대상이 중복 삭제되어 프로그램이 붕괴될 수 있다.그래서 COM 인터페이스를 사용하려면 반드시 조심해야 한다.그러나 모든 코드에 AddRef와 Release가 정확하다고 해서 반드시 만전을 기할 수 있는 것은 아니다. 예를 들어void SomeApp(IHello*pHello) {IHello*pCopy=pHello;pCopy->AddRef(), Otherapp(), pCopy->Hello(), pCopy->Release(), pCopy->Release()}빈틈이 없는 것처럼 보이지만 오더앱에서 이상이 나왔다고 가정하면 pCopy->Release는 넘어가지 않을까요?다행히 모든 문제는 간단에서 복잡으로, 그리고 복잡에서 간단으로, 왜냐하면 우리는 CComPtr가 있기 때문이다!
CComPtr는 스마트 포인터라고 불리며 ATL이 제공하는 모델 클래스로 문법적으로 AddRef와Release를 자동으로 완성할 수 있다.(소스 코드는 atlbase.h에서) CComPtr의 사용법은 매우 간단하다. IHello*의 경우 프로그램의 모든 인터페이스 포인터 유형(파라미터를 제외하고)을 CComPtr로 대체하면 된다.즉 프로그램에서 매개변수를 제외하고 더 이상 IHello*를 사용하지 않으며 모두 CComPtr로 대체됩니다.CComPtr의 사용법은 일반 COM 포인터와 거의 같으며, 사용 중에는 다음과 같은 몇 가지 주의가 필요하다.1. CComPtr는 AddRef와 Release의 정확한 호출을 보장했기 때문에 필요없고 AddRef와 Release를 다시 호출할 수 없습니다.2. 스마트 포인터를 놓으려면 NULL 값을 입력하면 됩니다.3. CComPtr 자체를 분석할 때COM 포인터를 놓습니다.4. CComPtr에 & 연산자(포인터 주소 지정)를 사용할 때 CComPtr가 NUL인지 확인합니다.(CComPtr의 주소를 통해 CComPtr에 값을 부여할 때 AddRef가 자동으로 호출되지 않기 때문에 NULL이 아니면 앞의 바늘을 놓을 수 없고 CComPtr는 assert 경고를 사용합니다) 아까 프로그램의 예를 들면:void SomeApp(IHello * pHello) {CComPtr pCopy = pHello, Otherapp(), pCopy->Hello().pCopy는 부분적인 대상이기 때문에 Otherapp()이 이상을 던져도 pCopy는 바늘이 풀릴 수 있도록 분석된다.프로그램이 발표되기 전까지도 COM 포인터의 인용 계수로 인해 붕괴되고 싶지 않다면 이 점을 명심해라. 프로그램에서 파라미터를 제외하고는 COM 포인터 형식을 직접 사용하지 말고 반드시 CComPtr로 대체해야 한다.
#include <atlcomcli.h>
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
List 컬렉션 객체에서 서로 다른 속성 크기로 정렬된 인스턴스인스턴스는 다음과 같습니다. 테스트: 출력 결과는 다음과 같습니다. 두 번째 방법은 컬렉션에 따라.sort 재부팅 방법(예: 마스터 클래스에서 이렇게 작성하면 됩니다. 출력 결과는 다음과 같습니다. 전자의 코드 구조...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.