По поводу вопросов. Да, два написанных пункта верны. Теперь обсудим, что нужно делать дальше.
В
AllowDrop тебе передают указатель на FORMATETC. Эта структура определяет формат перетаскиваемых данных. Для того, чтобы отсеять все ненужные форматы объектов, которые глупый пользователь может попытаться перетащить в твоё окно, используй сравнение с полем FORMATETC::cfFormat. Системный формат для списка файлов равен CF_HDROP, так что на 95% именно с ним у нужно сравнивать, но ты на всякий случай проверь. Во всех остальных случаях возвращай из
AllowDrop false.
Слудующий шаг - это извлечение данных из IDataObject (его создавать не нужно, он является входным параметром в
AllowDrop). Самый главный метод интерфейса - это
GetData. Методу передаётся поинтер на FORMATETC (который уже есть) и указатель на структуру STGMEDIUM, которая будет output параметром (то есть метод заполнит её данными, как следствие туда нельзя передавать NULL, иначе всё умрёт). После того, как поработаешь со структой STGMEDIUM, не забудь освободить структуру с помощью функции
ReleaseStgMedium.
Последняя структура является обобщённым хранилищем информации. Первое, что нужно сделать, это проверить тип данных, которые содержаться в поле tymed. Есть большая вероятность, что он будет равняться TYMED_FILE. Если это так, то следует использовать поле lpszFileName, в котором будет храниться путь к фолдеру. Есть ещё важное замечание. Если вдруг формат окажется TYMED_HGLOBAL, то напрямую поле hGlobal использовать нельзя. Нужно сначала залочить глобальную память (
GlobalLock), затем поработать с ней, потом разлочить (
GlobalUnlock).
Всё, я выдохся. Хотел ещё рассказать как можно зарегистрировать свой собственный формат перетаскиваемых объектов, но уже спать охота. Если это тоже понадобится, то напишу в следующем посте.
Вот ссылки на техническую документацию об обсуждённых сущностях:
FORMATETC
FORMATETC::cfFormat
STGMEDIUM
STGMEDIUM::TYMED