// .h 파일
class ATL_NO_VTABLE CTestControl :
...
public IDropTarget // 인터페이스 추가
...
{
    ...
    // 오버라이딩
    STDMETHOD(DragEnter)(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect);
    STDMETHOD(DragOver)(DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect);
    STDMETHOD(DragLeave)(void);
    STDMETHOD(Drop)(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect);
    ...
}

// .cpp 파일
// 초기화 부분에 추가
::RegisterDragDrop(m_hWnd, (IDropTarget*)this);

// 함수구현
HRESULT CTestControl ::DragEnter(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect)
{
    return S_OK;
}

HRESULT CTestControl ::DragOver(DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect)
{
    return S_OK;
}

HRESULT CTestControl ::DragLeave(void)
{
    return S_OK;
}

HRESULT CTestControl ::Drop(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());  // init MFC

    COleDataObject DataObj;
    HGLOBAL        hGlobal;
    HDROP          hDropInfo;

    DataObj.Attach(pDataObject, FALSE);

    // Data Object 에서 리스트를 읽어온다.
    // HDROP 구조체에 저장되므로, HDROP 핸들을 얻어와 Drag&Drop API를 사용하면 된다.
    hGlobal = DataObj.GetGlobalData (CF_HDROP);
    if ( NULL != hGlobal )
    {
        hDropInfo = (HDROP) GlobalLock (hGlobal);

        UINT uDropCnt = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);    // 드롭된 파일의 갯수
        char buffer[256];  // Drag&Drop된 파일,폴더의 절대경로 저장

        for(UINT i=0; i<uDropCnt; i++)
        {
            // 파일의 경로 얻어옴
            DragQueryFile(hDropInfo, i, buffer, 255);
            // 파일경로 확인
            ::MessageBox(NULL, buffer, _T("Filename"), MB_OK);
        }
        GlobalUnlock (hGlobal);
    }

    DataObj.Detach();
   
    return S_OK;
}