2009-09-12 6 views
0

IUnknown 인터페이스를 구현하는 클래스를 만들려고합니다. 내가 관련 uuid.lib 여러 다른 사람을 포함했다IUnknown, 해결되지 않은 외부 기호 구현

#pragma once 

#include "stdafx.h" 
#include "Unknwn.h" 


class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9 
{ 
public: 
Vmr9Presenter(void); 
HRESULT Initialize(void); 
~Vmr9Presenter(void); 
STDMETHODIMP QueryInterface(const IID &riid, void **ppvObject); 
}; 

: 나는 헤더 파일에 다음 코드를 가지고있다. 내가 컴파일 할 때 그러나, 나는 오류 얻을 :.이 뭔가 당겨지고되지 않는다는 것을 믿고 날 리드

Error 2 error LNK2001: unresolved external symbol "public: virtual long __stdcall Vmr9Presenter::QueryInterface(struct _GUID const &,void * *)" ([email protected]@@[email protected]@[email protected]) Vmr9Presenter.obj VmrPresenter

을이 오류를 제거하는 방법에 대한 어떤 제안?

답변

4

모든 I * 인터페이스는 인터페이스 정의입니다. 인터페이스는 C++ 용어로 된 순수 가상 기본 클래스입니다.

당신이 말할 때 : 당신 "는 Vmr9Presenter 클래스는이 인터페이스를 구현하는"말을하는지

class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9 

. "Vmr9Presenter 클래스는 IVMRImagePresenter9 및 IVMRSurfaceAllocator9라는 두 개의 순수 가상 기본 클래스에서 파생됩니다. 관례 상 모든 인터페이스는 IUnknown이라는 순수 가상 기본 클래스에서 파생됩니다 ..

즉, 모든 메서드를 다음과 같이 구현해야합니다. .. 당신이 IVMRImagePresenter9 및 IVMRSurfaceAllocator9의 모든 메소드를 구현해야하는 그래서 개체에서 순수 가상 기본 클래스는 또한의 IUnknown 포함 자신의 기본 클래스의 모든 메소드를 구현해야

의 IUnknown 3 가지 방법이 있습니다. AddRef에를 , Release 및 QueryInterface.보고 한 오류로 인해 링커에서 Vmr9Presenter :: QueryInterface라는 함수를 찾지 못했습니다.

일단 작동하면 클래스에 이러한 함수를 추가해야합니다. 당신의 코멘트를

HRESULT IVmr9Presenter::QueryInterface(REFIID iid, PVOID *pvInterface) 
{ 
    if (pvInterface == NULL) 
    { 
     return E_POINTER; 
    } 
    *pvInterface = NULL; 
    if (iid == IID_IUnknown) 
    { 
     *pvInterface = static_cast<PVOID>(static_cast<IUnknown *>(this)); 
     return S_OK; 
    } 
    if (iid == IID_IVMRSurfaceAllocator9) 
    { 
     *pvInterface = static_cast<PVOID>(static_cast<IVMRSurfaceAllocator9*>(this)); 
     return S_OK; 
    } 
     : 
    else 
    { 
     return E_NOINTERFACE; 
    } 
} 
+0

당신의 설명이 완벽합니다. 그러나 게시 한 코드에서 static_cast (this)은 모호한 참조로 컴파일러에서 플래그가 지정됩니다. IVMRSurfaceAllocator9와 IVMRImagePresenter9가 모두 IUnknown에서 파생 되었기 때문에 이것을 가정합니다. 그러나이 캐스트는 작동하는 것으로 보입니다. static_cast (static_cast (static_cast (이))) 내가 컴파일러 자체에의 IUnknown의 어떤 구현을 사용하도록 선택할 수 있기 때문입니다 겠지? 아니면 내가 완전히 기지에서 벗어나서 이것이 내가하는 일을하지 않을 것인가? – Alex

+0

당신은 완전히 옳다, 나는 게으르다. 미안해.귀하의 솔루션은 정확합니다. –

0

IVMRImagePresenter9, IVMRSurfaceAllocator9 중 하나가 이미 IUnknown을 구현합니까? 어쩌면 당신이 필요합니다

class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9, IUnknown 

난 당신이 또한 너무의 IUnknown에 대한 docs에 따라 AddRef()와 Release() 구현해야합니다 생각합니다.

+0

을 바탕으로 하나가의 IUnknown을 구현 않으면, 난 그냥 reinterpret_cast를 (이) 수행 및 QueryInterface를 호출 할 수 있습니다 : 같은

는 일반적으로 QI 구현 보인다? – Alex

+0

래리 (Larry)는 각 인터페이스에 노출 된 함수의 구현을 만들어야한다고 말했습니다. 그런 다음 사용할 IUnknown을 말해야합니다. –