2009-05-04 3 views
1

공식적으로 함수가 성공하지 않는 한 COM 함수의 [out] 매개 변수를 사용하면 안됩니다. 이는 [out] 매개 변수를 사용할 수 있는지를 확인하는 세 가지 방법이 있음을 의미합니다.COM에서 [out] 매개 변수를 사용할 수 있는지 어떻게 확인해야합니까?

interface IFoo : IUnknown { 
    HRESULT GetOtherFoo([out] IFoo** ppFoo); 
    HRESULT Bar(); 
}; 

당신이 그것을 사용하여 다음과 같은 방법으로 추천 할 것입니다 다음과 같은 인터페이스를 고려?

1. 반환 값

CComPtr<IFoo> other; 
HRESULT hr = foo->GetOtherFoo(&other); 
if (SUCCEEDED(hr)) 
    other->Bar(); 

이 나를 만드는 비트 IFoo의 버그가 NULL 포인터 역 참조가 발생할 수 있기 때문에 신경.

2. 출력 매개 변수이 방법이 실패 할 경우 매개 변수가 변경되었을 경우는 [out] 매개 변수를 (변경해서는 안된다는 사실에 따라

< ==> 그것을 사용하는 것이 안전합니다). 이 종류의 포인터가 그렇게 쓰레기가 될 수 없습니다 NULL없는 경우 CComPtr의 소멸자 Release를 호출합니다, 어쨌든 일어나는 것을

CComPtr<IFoo> other; 
foo->GetOtherFoo(&other); 
if (other) 
    other->Bar(); 

참고.

3. 편집증 방법이 내 의견에 조금 자세한 모두

CComPtr<IFoo> other; 
HRESULT hr = foo->GetOtherFoo(&other); 
if (SUCCEEDED(hr) && other) 
    other->Bar(); 

을 확인합니다.


P. related question을 참조하십시오.

답변

2

더 많은 수표를 작성하고보다 안정적인 옵션 3을 만들기 위해 코드를 조금 느리게 만들려면 3을 참조하십시오. COM 서버에 버그가있을 것으로 예상하므로이를 확인하는 것이 좋습니다.

2

HRESULT 성공을 반환하지만 일부 출력 매개 변수를 NULL로 설정하는 COM 서버 메서드는 그리 일반적이지 않습니다. 이 경우 IClientSecurity :: QueryBlanket이 사용되는 경우가 있지만 일반적으로 클라이언트는 메서드가 성공적으로 반환 된 경우 모든 출력 매개 변수가 NULL이 아니길 기대할 수 있습니다.

그것은 결국 방법이 문서화 된 방법의 문제입니다. 그러나 기본 경우에는 1을 안전한 방법으로 생각합니다.

관련 문제