나는 개체를 반환하는 방법으로 COM 인터페이스가 :작성할 수없는 COM 개체에 대한 참조 카운터를 더 잘 초기화하는 방법은 무엇입니까?
interface ICreatorInterface {
HRESULT CreateObject(IObjectToCreate**);
};
의 핵심은 ICreatorInterface::CreateObject()
를 호출하면 IObjectToCreate
인터페이스를 구현하는 객체를 검색 할 수있는 유일한 방법이라는 것이다.
HRESULT CCreatorInterfaceImpl::CreateObject(IObjectToCreate** result)
{
//CObjectToCreateImpl constructor sets reference count to 0
CObjectToCreateImpl* newObject = new CObjectToCreateImpl();
HRESULT hr = newObject->QueryInterface(__uuidof(IObjectToCreate), (void**)result);
if(FAILED(hr)) {
delete newObject;
}
return hr;
}
또는 경우에
HRESULT CCreatorInterfaceImpl::CreateObject(IObjectToCreate** result)
{
//CObjectToCreateImpl constructor sets reference count to 1
CObjectToCreateImpl* newObject = new CObjectToCreateImpl();
HRESULT hr = newObject->QueryInterface(__uuidof(IObjectToCreate), (void**)result);
// if QI() failed reference count is still 1 so this will delete the object
newObject->Release();
return hr;
}
의 차이는 개체 삭제를 구현하는 방법을 참조 카운터가 초기화되고 어떻게이 QueryInterface()
실패 이러한 방법 : 나는 이런 식으로 할 수있는 C에서
CCreatorInterfaceImpl
과
CObjectToCreateImpl
을 완전히 제어 할 수 있으므로 두 가지 방법 중 하나를 선택할 수 있습니다.
IMO 첫 번째 변형이 더 명확합니다. 모든 참조 계산 항목은 코드 한 조각에 있습니다. 내가 뭔가를 봤어? 왜 두 번째 접근법이 더 좋을까요? 위의 어느 것이 더 낫고 왜?
나는 당신의 점을 볼 수 있지만, 바로 그 동작은 훨씬 더 간단 달성 할 수있다 : 생성자에서 0 refcount가 init을 문제의 코드에 스마트 포인터를 사용 - 바로 스마트로 new'ed 객체를 바인딩 포인터를 누른 다음 QI() 호출 - ATL :: CComPtr 허용, 아마도 _com_ptr_t 너무 있습니다. – sharptooth