Поделиться через


Интерфейсы передачи данных

Интерфейс IDataObject предоставляет потребителям данных методы для получения и настройки данных объекта, определения форматов, поддерживаемых объектом, а также регистрации и получения уведомлений при изменении данных в объекте. При получении данных вызывающий объект может указать формат, в котором он хочет отобразить данные. Однако источник данных определяет носитель хранилища, который возвращается в параметре out, предоставленном вызывающим средством.

По сути, IDataObject предоставляет все средства, необходимые для реализации передачи буфера обмена Windows или составной передачи документов в приложениях. Если вы также хотите поддерживать передачу перетаскивания, необходимо реализовать интерфейсы IDropSource и IDropTarget вместе с IDataObject.

Интерфейс IDataObject в сочетании с API буфера обмена OLE предоставляет все возможности API буфера обмена Windows. Обычно не требуется использовать оба API буфера обмена. Поставщики данных, поддерживающие передачу перетаскивания или составные документы OLE, должны реализовать интерфейс IDataObject . Если приложение поддерживает передачу только буфера обмена, но планируется добавить перетаскивание или составные документы в более поздних выпусках, возможно, потребуется реализовать ИНТЕРФЕЙСы IDataObject и ИНТЕРФЕЙСы API буфера обмена OLE, чтобы свести к минимуму время, затраченное на перебор и отладку позже. Также может потребоваться реализовать IDataObject , чтобы использовать носитель передачи, отличный от глобальной памяти.

В следующей таблице приведены сведения об используемых типах передачи данных в зависимости от типов передачи данных, которые требуется поддерживать:

Для поддержки... Использование
Составные документы
Idataobject
Перетаскивание передачи
IDataObject, IDropSource, IDropTarget, DoDragDrop (или эквивалент)
Передача буфера обмена с использованием глобальной памяти исключительно
API буфера обмена
Передача буфера обмена с помощью сред обмена, отличных от глобальной памяти.
Idataobject
Перенос буфера обмена теперь, но перетаскивание или составные документы позже
IDataObject и интерфейсы и функции, перечисленные выше, для перетаскивания передачи

Когда пользователь инициирует операцию передачи данных, исходное приложение создает экземпляр IDataObject и делает данные доступными в одном или нескольких форматах. При передаче буфера обмена приложение вызывает функцию OleSetClipboard для передачи указателя объекта данных в OLE. (OleSetClipboard также предлагает стандартные форматы данных буфера обмена для приложений OLE версии 1 и не OLE.) В передаче перетаскивания приложение вызывает вместо этого функцию DoDragDrop.

На принимающей стороне передачи назначение получает указатель IDataObject либо в качестве аргумента вызова IDropTarget::D rop, либо путем вызова функции OleSetClipboard в зависимости от того, является ли передача путем перетаскивания или буфера обмена. Получив этот указатель, назначение вызывает IDataObject::EnumFormatEtc , чтобы узнать, какие форматы доступны для получения и о типах носителей, которые можно получить. Вооружившись этой информацией, принимающее приложение запрашивает данные с вызовом IDataObject::GetData.

Передача данных