2014-01-22 16 views
3

최근에 COM을 배우기 시작했습니다. COM에서 함수의 반환 형식은 HRESULT 여야합니다. HRESULT에 대해 읽었을 때 GetLastError()의 문제가 발생했지만 그 이유는 IUnknown의 함수 AddRef()Release()ULONG 인 이유는 무엇입니까?AddRef() 및 Release()의 반환 형식이 HRESULT가 아닌 이유

저는 AddRef()이 (거의) 항상 QueryInterface()에서 호출되었으며 클라이언트는 호출하지 않아야한다는 대답을 생각해 냈습니다. Release()의 경우 반환 값이 확인되지 않습니다.

에 대한 답변을 논할 수 있지만 AddRef() - 클라이언트에게 전화해야 할 상황이있을 수 있습니다. 클라이언트가 해당 기능에 액세스 할 수 있으므로 클라이언트가 해당 기능을 호출하지 않을 것이라는 보장은 무엇입니까?

Release() 위해 - 그가

명확히하십시오 할 수 있기 때문에 다시, 사용자는 반환 형식을 확인 할 수 있습니다.

또한 이와 비슷합니다. COM 관련 함수가 아니라 강제로 HRESULT 반환 형식을 사용하는 규칙입니다.> 이것이 사실이라면 내 머리 속의 혼란을 막을 수 있습니다.

+2

'AddRef'와'Release'는 결코 실패 할 수 없으므로,'HRESULT'를 반환 할 필요가 없습니다. 마지막 질문 : ['[local]'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa367071.aspx) 메서드는'HRESULT'를 반환 할 필요가 없습니다 (그러나 그들이 원한다면 할 수있다); 다른 모든 메소드는'HRESULT'를 반환해야합니다. 마샬링 계층이 자체 오류 (예 : 호출이 시스템 경계를 넘어 원격 호스트에 도달 할 수없는 경우 네트워크 오류)를보고 할 수 있어야하기 때문입니다. 'AddRef'와'Release'는'[local] '입니다. –

+0

성공/실패 상태가 필요 없습니다 (위의 Igor 참조). 반환 값은 참조 카운터의 표시 인 유용한 것으로 재사용됩니다. 따라서 이러한 매우 자주 사용되는 방법을 경량 및 성능 효율적으로 만듭니다. –

+0

@IgorTandetnik 답장을 보내 주셔서 감사합니다. 그러나, 나는 여전히 클라이언트가'AddRef()'를 호출 할 필요가 있다고 생각한다. 예 : 클라이언트가 로컬 인터페이스 포인터를 가지고 있다고 가정하면 서버가 반환 한 유효한 인터페이스 포인터에 의해 할당됩니다. 클라이언트와 서버가 서로 다른 두 개의 프로세스 인 경우에도 주소 공간이 서로 다릅니다. 그래서'pIOne'이 서버에 의해 보내지고'pIOneTemp'가 로컬이면,'pIOneTemp = pIOne;'명령문 다음에 클라이언트는 완전히 다른 주소 공간에 있기 때문에'pIOneTemp'에'AddRef()'를 호출해야합니다. . 이제'HRESULT'를 반환하지 않아야하는 이유는 무엇입니까? – user2705939

답변

0

"AddRef 및 Release는 실패 할 수 없으므로 반환 HRESULT가 없습니다." - Igor Tandetnik

나는이 전체 질문과 누군가를 돕기를 바라는 모든 의견을 읽지 못해 내 눈이 피로 나고 있기 때문에 이것을 게시하고 있습니다. 질문이 마감되었습니다. 이 모든 쓰레기가 눈에 띄지 않고 사람들을 돕는 것이 훨씬 쉬울 것입니다.