필터클래스 상위 부분에

// 인터페이스 선언
#ifdef __cplusplus
extern "C" {
#endif
    // {45F7E6B9-861F-46fb-9549-7F70EB5DCFF0}
        DEFINE_GUID(IID_INetworkTCP,
                0x45f7e6b9, 0x861f, 0x46fb, 0x95, 0x49, 0x7f, 0x70, 0xeb, 0x5d, 0xcf, 0xf0);
        
        
    DECLARE_INTERFACE_(INetworkTCP, IUnknown)
    {
        STDMETHOD(LoadMessageBox) (THIS_  char*  msg) PURE;
    };
        
#ifdef __cplusplus
}
#endif

//////////////////////////////////////////////////////////////////////////

위와 같이 인터페이스를 선언해주고

class CNetworkTCPStream;

인터페이스를 상속받는다.

class CNetworkTCPFilter : public CSource
, public INetworkTCP
{
        friend class CNetworkTCPStream;

public:
        CNetworkTCPFilter(LPUNKNOWN pUnk, HRESULT *phr);
        virtual ~CNetworkTCPFilter(void);

// static
public:
        static CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *phr);

// Attributes
public:

// Operations
public:

        // 이 메소드는 인터페이스의 가상함수. 구현하여준다.
        STDMETHODIMP LoadMessageBox(char* msg) {
                MessageBox(NULL, msg, NULL, NULL);
        }


// Overrides
protected:

// Implementations
protected:

        // 인터페이스를 외부에 노출시킨다
        DECLARE_IUNKNOWN;
        STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv) {
                if(riid == IID_INetworkTCP)
                        return GetInterface((INetworkTCP*)this, ppv);
                else
                        return CSource::NonDelegatingQueryInterface(riid, ppv);
        }


// member variables
private:
};

위와 같이 하면 인터페이스를 상속받고 구현하여 노출시키면 사용할 수 있다.

사용방법은 어플리케이션에서 인터페이스 선언부분을 가져다 적어주고

인터페이스를 호출하여 사용하면 된다.

예)

INetworkTCP* pITCP;
pFilterNetworkTCPFilter->QueryInterface(IID_INetworkTCP, (void**)&pITCP);
pITCP->LoadMessageBox("Test");