Help and Support
 

powered byLive Search

How to get dropped file names by using OLE drag and drop in Visual C++

Article ID:185572
Last Review:November 21, 2006
Revision:4.1
This article was previously published under Q185572
On This Page

SUMMARY

Traditionally, developers have used the WM_DROPFILES message to handle files dropped from the File Manager or Windows Explorer. This message is sent when the user drops a file on the window of an application that has registered itself as a recipient of dropped files.

OLE drag and drop supports this same functionality. Both techniques involve passing a global HDROP (drop structure handle) from the source to the target. WM_DROPFILES passes this handle in the WPARAM value. OLE drag and drop passes the HDROP with the data object.

This article demonstrates how to get the dropped file names using OLE drag and drop. The information in this article supplements the following Microsoft Knowledge Base article:
135299 (http://support.microsoft.com/kb/135299/) How to add OLE drag-and-drop functionality to a pre-existing MFC application

Back to the top

MORE INFORMATION

To retrieve the dropped file names from a drop source, modify the sample code included with Microsoft Knowledge Base article 135299 as follows.

Back to the top

Sample code

   // OnDrop is called by OLE DLLs when an item is dropped in a window
   // that is registered with the OLE DLLs.
   // 
   BOOL COleEditDropTarget::OnDrop(CWnd* pWnd, COleDataObject* pDataObject,
      DROPEFFECT dropEffect, CPoint point )
   {
    HGLOBAL  hGlobal;
    LPCSTR   pData;

    FORMATETC fmtetc =
   { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
    STGMEDIUM stgmed;
    TCHAR szFileName[_MAX_PATH + 1];

    if(pDataObject->GetData(CF_HDROP, &stgmed, &fmtetc))
    {
        HDROP hdrop = (HDROP)GlobalLock(stgmed.hGlobal);

        if (NULL != hdrop)
        {
            UINT nFiles = DragQueryFile(hdrop, (UINT)-1, NULL, 0);

            for(UINT nNames = 0; nNames < nFiles; nNames++)
            {
                ZeroMemory(szFileName, _MAX_PATH + 1);
                DragQueryFile
                    (hdrop, nNames, (LPTSTR)szFileName, _MAX_PATH + 1);
                // Do something with szFileName.
            }
            GlobalUnlock(hdrop);

        }
        ReleaseStgMedium(&stgmed);
      return TRUE;

    } else {

   // Get text data from ColeDataObject.
   hGlobal=pDataObject->GetGlobalData(CF_TEXT);

   // Get a pointer to data.
   pData=(LPCSTR)GlobalLock(hGlobal);
   ASSERT(pData!=NULL);

   // Set text in the dropped window.
   ((CEdit*)pWnd)->SetWindowText(pData);

   // Unlock memory.
   GlobalUnlock(hGlobal);

   return TRUE;
   }
   }
				
(c) Microsoft Corporation 1998, All Rights Reserved. Contributions by Robert Duke, Microsoft Corporation.

Back to the top


APPLIES TO
Microsoft Foundation Class Library 4.2, when used with:
  Microsoft Visual C++ 4.0 Standard Edition
  Microsoft Visual C++ 4.1 Subscription
  Microsoft Visual C++ 4.2 Enterprise Edition
  Microsoft Visual C++ 4.2 Professional Edition
  Microsoft Visual C++ 5.0 Enterprise Edition
  Microsoft Visual C++ 5.0 Professional Edition
  Microsoft Visual C++ 6.0 Enterprise Edition
  Microsoft Visual C++ 6.0 Professional Edition
  Microsoft Visual C++, 32-bit Learning Edition 6.0

Back to the top

Keywords: 
kbhowto kbinfo kbdragdrop kbclipboard kbdataobject KB185572

Back to the top

Article Translations

 

Other Support Options

  • Need More Help?
    Contact a Support professional by E-mail, Online or Phone.
  • Customer Service
    For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
  • Newsgroups
    Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.