CComPtr 사용법 (회전)

1487 단어 대상포인터
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>

좋은 웹페이지 즐겨찾기