class CDUIDropTarget:
    public IDropTarget
{

protected:
    ULONG         _cRef;
    IDropTarget * _pDT;
    IDropTarget * _pNextDT;

public:
    CDUIDropTarget();

    // IUnknown methods
    STDMETHODIMP         QueryInterface(REFIID, LPVOID *);
    STDMETHODIMP_(ULONG) AddRef();
    STDMETHODIMP_(ULONG) Release();

    // IDropTarget methods
    STDMETHODIMP DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect);
    STDMETHODIMP DragOver(DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect);
    STDMETHODIMP DragLeave(void);
    STDMETHODIMP Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect);

    HRESULT Initialize (LPITEMIDLIST pidl, HWND hWnd, IDropTarget **pdt);

private:
    ~CDUIDropTarget();

    VOID _Cleanup();
};