Форматы буфера обмена оболочки

Форматы буфера обмена оболочки используются для определения типа данных оболочки, передаваемых через буфер обмена. Большинство форматов буфера обмена оболочки определяют тип данных, например список имен файлов или указатели на списки идентификаторов элементов (PIDLs). Однако некоторые форматы используются для обмена данными между источником и целевым объектом. Они могут ускорить процесс передачи данных, поддерживая операции оболочки, такие как оптимизированное перемещение и delete_on_paste. Данные оболочки всегда содержатся в объекте данных , который использует структуру FORMATETC в качестве более общего способа характеристики данных. Член cfFormat структуры имеет формат буфера обмена для определенного элемента данных. Другие члены предоставляют дополнительные сведения, например механизм передачи данных. Данные содержатся в сопроводительной структуре STGMEDIUM .

Примечание

Стандартные идентификаторы буфера обмена имеют форму CF_XXX. Распространенный пример — CF_TEXT, который используется для передачи текстовых данных ANSI. Эти идентификаторы имеют предопределенные значения и могут использоваться непосредственно со структурами FORMATETC . За исключением CF_HDROP, идентификаторы формата оболочки не являются предопределенными. За исключением DragWindow, они имеют форму CFSTR_XXX. Чтобы отличить эти значения от предопределенных форматов, их часто называют простыми форматами. Однако, в отличие от предопределенных форматов, они должны быть зарегистрированы как источником, так и целевым объектом, прежде чем их можно будет использовать для передачи данных. Чтобы зарегистрировать формат оболочки, включите файл заголовка Shlobj.h и передайте идентификатор формата CFSTR_XXX в RegisterClipboardFormat. Эта функция возвращает допустимое значение формата буфера обмена, которое затем можно использовать в качестве члена cfFormat структуры FORMATETC .

 

Форматы буфера обмена оболочки организованы в три группы в зависимости от того, как они используются.

Форматы для передачи объектов файловой системы

Эти форматы используются для передачи одного или нескольких файлов или других объектов оболочки.

CF_HDROP

Этот формат буфера обмена используется при передаче расположений группы существующих файлов. В отличие от других форматов оболочки, он является предопределенным, поэтому нет необходимости вызывать RegisterClipboardFormat. Данные состоят из структуры STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на структуру DROPFILES в качестве элемента hGlobal .

Элемент pFiles структуры DROPFILES содержит смещение к двойному массиву символов, завершающемся null, который содержит имена файлов. При извлечении формата CF_HDROP из объекта данных можно использовать DragQueryFile для извлечения отдельных имен файлов из объекта глобальной памяти. Если вы создаете формат CF_HDROP для размещения в объекте данных, необходимо создать массив имен файлов.

Массив имен файлов состоит из ряда строк, каждая из которых содержит полный путь к файлу, включая завершающий символ NULL . К последней строке добавляется дополнительный символ NULL для завершения массива. Например, если файлы c:\temp1.txt и c:\temp2.txt передаются, массив символов выглядит следующим образом:

c:\temp1.txt'\0'c:\temp2.txt'\0''\0'

Примечание

В этом примере "\0" используется для представления символа NULL , а не литеральных символов, которые должны быть включены.

Если объект был скопирован в буфер обмена в рамках операции перетаскивания, элемент pt структуры DROPFILES содержит координаты точки, в которой был удален объект. Для извлечения координат курсора можно использовать DragQueryPoint .

Если этот формат присутствует в объекте данных, цикл перетаскивания OLE имитирует WM_DROPFILES функциональные возможности с целевыми объектами, не являющимися объектами перетаскивания OLE. Это важно, если приложение является источником операции перетаскивания в системе Windows 3.1.

CFSTR_FILECONTENTS

Этот идентификатор формата используется с форматом CFSTR_FILEDESCRIPTOR для передачи данных, как если бы они были файлом, независимо от того, как они хранятся на самом деле. Данные состоят из структуры STGMEDIUM , представляющей содержимое одного файла. Файл обычно представлен в виде объекта потока, что позволяет избежать необходимости помещать содержимое файла в память. В этом случае для элемента структурыSTGMEDIUM задано значение TYMED_ISTREAM, а файл представлен интерфейсом IStream . Файл также может быть хранилищем или объектом глобальной памяти (TYMED_ISTORAGE или TYMED_HGLOBAL). Связанный формат CFSTR_FILEDESCRIPTOR содержит структуру FILEDESCRIPTOR для каждого файла, которая указывает имя и атрибуты файла.

Целевой объект обрабатывает данные, связанные с CFSTR_FILECONTENTS форматом, как если бы это был файл. Когда целевой объект вызывает IDataObject::GetData для извлечения данных, он указывает конкретный файл, задав член lindex структуры FORMATETC в отсчитываемый от нуля индекс структуры FILEDESCRIPTOR файла в сопроводительном формате CFSTR_FILEDESCRIPTOR . Затем целевой объект использует возвращенный указатель интерфейса или дескриптор глобальной памяти для извлечения данных.

CFSTR_FILEDESCRIPTOR

Этот идентификатор формата используется с форматом CFSTR_FILECONTENTS для передачи данных в виде группы файлов. Эти два формата являются предпочтительным способом передачи объектов оболочки, которые не хранятся в файлах файловой системы. Например, эти форматы можно использовать для передачи группы сообщений электронной почты в виде отдельных файлов, даже если каждое сообщение электронной почты фактически хранится в виде блока данных в базе данных. Данные состоят из структуры STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на структуру FILEGROUPDESCRIPTOR , за которой следует массив, содержащий одну структуру FILEDESCRIPTOR для каждого файла в группе. Для каждой структуры FILEDESCRIPTOR существует отдельный формат CFSTR_FILECONTENTS, содержащий содержимое файла. Чтобы определить формат CFSTR_FILECONTENTS конкретного файла, задайте для значения lIndex структуры FORMATETC отсчитываемый от нуля индекс структуры FILEDESCRIPTOR файла.

Формат CFSTR_FILEDESCRIPTOR обычно используется для передачи данных как группы файлов, независимо от того, как они хранятся на самом деле. С точки зрения целевого объекта каждый формат CFSTR_FILECONTENTS представляет один файл и обрабатывается соответствующим образом. Однако источник может хранить данные любым выбранным способом. Хотя формат CSFTR_FILECONTENTS может соответствовать одному файлу, он также может представлять, например, данные, извлеченные источником из базы данных или текстового документа.

CFSTR_FILENAME

Этот идентификатор формата используется для передачи одного файла. Данные состоят из структуры STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на одну строку с завершением NULL, содержащую полный путь к файлу. Этот формат был заменен CF_HDROP, но поддерживается для обратной совместимости с приложениями Windows 3.1.

CFSTR_FILENAMEMAP

Этот идентификатор формата используется при переименовании и передаче группы файлов в CF_HDROP формате. Данные состоят из структуры STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на массив символов с двойным завершением NULL. Этот массив содержит новое имя для каждого файла в том же порядке, в котором перечислены файлы в сопроводительном формате CF_HDROP. Формат массива символов совпадает с форматом, используемым CF_HDROP для перечисления переданных файлов.

CFSTR_MOUNTEDVOLUME

Этот идентификатор формата используется для передачи пути на подключенном томе. Он похож на CF_HDROP, но содержит только один путь и может обрабатывать длинные строки пути, которые могут потребоваться для представления пути при подключении тома к папке. Данные состоят из структуры STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на одну строку с пустым завершением, содержащую полный путь к файлу. Строка пути должна заканчиваться символом "\", а затем завершающим значением NULL.

До Windows 2000 тома можно было подключать только к буквам диска. В системах Windows 2000 и более поздних версий с диском в формате NTFS можно также подключать тома к пустым папкам. Эта функция позволяет подключать том без использования буквы диска. Подключенный том может использовать любой поддерживаемый формат, включая FAT, FAT32, NTFS и CDFS.

Страницы можно добавить на страницу свойств Drive Properties, реализовав обработчик страницы свойств. Если том подключен к букве диска, оболочка передает сведения о пути обработчику в формате CF_HDROP . В системах Windows 2000 и более поздних версий формат CF_HDROP используется при подключении тома к букве диска, как и в более ранних системах. Однако если том подключен к папке, вместо CF_HDROP используется идентификатор формата CFSTR_MOUNTEDVOLUME .

Если для подключения томов будут использоваться только буквы дисков, будут использоваться только CF_HDROP , а существующие обработчики страниц свойств будут работать так же, как и в более ранних системах. Однако если требуется, чтобы обработчик отображал страницу для томов, подключенных к папкам, а также буквы дисков, обработчик должен иметь представление о форматах CSFTR_MOUNTEDVOLUME и CF_HDROP.

CFSTR_SHELLIDLIST

Этот идентификатор формата используется при передаче расположений одного или нескольких существующих объектов пространства имен. Он используется практически так же, как CF_HDROP, но содержит PIDL вместо путей файловой системы. Использование PIDLs позволяет формату CFSTR_SHELLIDLIST обрабатывать виртуальные объекты, а также объекты файловой системы. Данные являются структурой STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на структуру CIDA .

Элемент aoffset структуры CIDA — это массив, содержащий смещения к началу структуры ITEMIDLIST для каждого передаваемого файла PIDL. Чтобы извлечь определенный PIDL,сначала определите его индекс. Затем добавьте значение aoffset , соответствующее этому индексу, в адрес структуры CIDA .

Первый элемент aoffset содержит смещение к полному идентификатору PIDL родительской папки. Если этот PIDL пуст, родительская папка — это рабочий стол. Каждый из оставшихся элементов массива содержит смещение к одному из передаваемых PIDLs. Все эти PIDL относятся к идентификатору PIDL родительской папки.

Следующие два макроса можно использовать для получения PIDL из структуры CIDA . Первый принимает указатель на структуру и извлекает PIDL родительской папки. Второй принимает указатель на структуру и извлекает один из других PIDL, определяемых индексом с отсчитываемым от нуля.

#define GetPIDLFolder(pida) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[0])

#define GetPIDLItem(pida, i) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[i+1])

Примечание

Значение, возвращаемое этими макросами, является указателем на структуру ITEMIDLIST PIDL. Так как эти структуры различаются по длине, необходимо определить конец структуры, проходя по каждой из структур SHITEMID структуры ITEMIDLIST, пока не достигнете двухбайтового значения NULL, обозначающего конец.

CFSTR_SHELLIDLISTOFFSET

Этот идентификатор формата используется с такими форматами, как CF_HDROP, CFSTR_SHELLIDLIST и CFSTR_FILECONTENTS , чтобы указать положение группы объектов после передачи. Данные состоят из структуры STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на массив структур POINT . Первая структура задает экранные координаты (в пикселях) верхнего левого угла прямоугольника, включающего группу. Остальные структуры определяют расположение отдельных объектов относительно положения группы. Они должны быть в том же порядке, что и для перечисления объектов в связанном формате.

Форматы для передачи виртуальных объектов

Формат CFSTR_SHELLIDLIST можно использовать для передачи файловой системы и виртуальных объектов. Однако существует также несколько специализированных форматов для передачи определенных типов виртуальных объектов.

CFSTR_NETRESOURCES

Этот идентификатор формата используется при передаче сетевых ресурсов, таких как домен или сервер. Данные являются структурой STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на структуру NRESARRAY . Член nr этой структуры указывает на структуру NETRESOURCE , член которой lpRemoteName содержит строку, завершающуюся null, идентифицируя сетевой ресурс. Затем целевой объект удаления может использовать данные с любой из функций API сети Windows (WNet), таких как WNetAddConnection, для выполнения сетевых операций с объектом .

CFSTR_PRINTERGROUP

Этот идентификатор формата используется при передаче понятных имен принтеров. Данные являются структурой STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на строку в том же формате, что и для CF_HDROP. Однако элемент pFiles структуры DROPFILES содержит одно или несколько понятных имен принтеров вместо путей к файлам.

CFSTR_INETURL

Этот идентификатор формата заменяет CFSTR_SHELLURL (не рекомендуется). Если вы хотите, чтобы приложение управляло URL-адресами буфера обмена, используйте CFSTR_INETURL вместо CFSTR_SHELLURL (не рекомендуется). Этот формат дает лучшее представление буфера обмена для одного URL-адреса. Если юникод не определен, приложение получает версию URL-адреса CF_TEXT или CFSTR_SHELLURL. Если определен ЮНИКОД, приложение получает CF_UNICODE версию URL-адреса.

CFSTR_SHELLURL (не рекомендуется)

Примечание

Этот идентификатор формата не рекомендуется использовать; вместо этого используйте CFSTR_INETURL.

 

Форматы обмена данными между источником и целевым объектом

Эти идентификаторы формата обеспечивают обмен данными между источником и целевым объектом. Форматы сопровождают данные и предоставляют приложениям большую степень контроля над операциями перемещения, копирования и вставки или перетаскивания с использованием объектов оболочки.

CFSTR_INDRAGLOOP

Этот идентификатор формата используется объектом данных, чтобы указать, находится ли он в цикле перетаскивания. Данные являются структурой STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на значение DWORD . Если значение DWORD не равно нулю, объект данных находится в цикле перетаскивания. Если значение равно нулю, объект данных не находится в цикле перетаскивания.

Некоторые целевые объекты удаления могут вызывать IDataObject::GetData и пытаться извлечь данные, пока объект все еще находится в цикле перетаскивания. Полная отрисовка объекта для каждого такого вхождения может привести к остановке курсора перетаскивания. Если объект данных поддерживает CFSTR_INDRAGLOOP, целевой объект может вместо этого использовать этот формат, чтобы проверка состояние цикла перетаскивания и избежать интенсивной отрисовки объекта до его фактического удаления. Форматы, требующие отрисовки с большим объемом памяти, по-прежнему должны быть включены в перечислитель FORMATETC и в вызовы IDataObject::QueryGetData. Если объект данных не задает CFSTR_INDRAGLOOP, он должен действовать так, как если бы значение равно нулю.

CFSTR_LOGICALPERFORMEDDROPEFFECT

Версия 5.0. Этот идентификатор формата позволяет источнику перетаскивания вызывать метод IDataObject::GetData объекта данных для определения результата передачи данных оболочки. Данные являются структурой STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на DWORD, содержащий значение DROPEFFECT .

Идентификатор формата CFSTR_PERFORMEDDROPEFFECT должен был позволить целевому объекту данных указать, какая операция на самом деле была выполнена. Однако оболочка по возможности использует оптимизированные перемещения для объектов файловой системы. В этом случае оболочка обычно задает CFSTR_PERFORMEDDROPEFFECT значение DROPEFFECT_NONE, чтобы указать объекту данных, что исходные данные были удалены. Таким образом, источник не может использовать значение CFSTR_PERFORMEDDROPEFFECT для определения выполненной операции. Хотя большинство источников не нуждаются в этой информации, существуют некоторые исключения. Например, несмотря на то, что оптимизированные перемещения устраняют необходимость в удалении данных в источнике, источнику все равно может потребоваться обновить связанную базу данных, чтобы указать, что файлы были перемещены или скопированы.

Если источнику необходимо знать, какая операция была выполнена, он может вызвать метод IDataObject::GetData объекта данных и запросить формат CFSTR_LOGICALPERFORMEDDROPEFFECT. Этот формат, по сути, отражает то, что происходит с точки зрения пользователя после завершения операции. Если создается новый файл и исходный файл удаляется, пользователь видит операцию перемещения, а для значения данных формата задано значение DROPEFFECT_MOVE. Если исходный файл по-прежнему существует, пользователь видит операцию копирования, а для значения данных формата задано значение DROPEFFECT_COPY. Если ссылка была создана, значение данных формата будет DROPEFFECT_LINK.

CFSTR_PASTESUCCEEDED

Этот идентификатор формата используется целевым объектом для информирования объекта данных с помощью метода IDataObject::SetData о том, что операция удаления при вставки выполнена успешно. Данные являются структурой STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на DWORD , содержащий значение DROPEFFECT . Этот формат используется для уведомления объекта данных о том, что он должен завершить операцию выреза и при необходимости удалить исходные данные. Дополнительные сведения см. в разделе Операции удаления при вставки.

CFSTR_PERFORMEDDROPEFFECT

Этот идентификатор формата используется целевым объектом для информирования объекта данных с помощью метода IDataObject::SetData о результатах передачи данных. Данные являются структурой STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на DWORD , заданное соответствующим значением DROPEFFECT , обычно DROPEFFECT_MOVE или DROPEFFECT_COPY.

Этот формат обычно используется, когда результатом операции может быть перемещение или копирование, например в оптимизированной операции перемещения или удаления при вставке. Он предоставляет целевому объекту надежный способ сообщить объекту данных, что на самом деле произошло. Он был введен, так как значение pdwEffect , возвращаемое DoDragDrop , не указывает, какая операция была выполнена. Формат CFSTR_PERFORMEDDROPEFFECT является надежным способом указать, что произошло неоптимизированное перемещение.

CFSTR_PREFERREDDROPEFFECT

Этот идентификатор формата используется источником, чтобы указать, является ли его предпочтительный метод передачи данных перемещением или копированием. Целевой объект удаления запрашивает этот формат путем вызова метода IDataObject::GetData объекта данных. Данные являются структурой STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на значение DWORD . Это значение равно DROPEFFECT_MOVE, если операция перемещения предпочтительна, или DROPEFFECT_COPY, если предпочтительна операция копирования.

Эта функция используется, когда источник может поддерживать операцию перемещения или копирования. Он использует формат CFSTR_PREFERREDDROPEFFECT для передачи своих предпочтений целевому объекту. Так как целевой объект не обязан учитывать запрос, целевой объект должен вызвать метод IDataObject::SetData источника в формате CFSTR_PERFORMEDDROPEFFECT , чтобы сообщить объекту данных, какая операция была выполнена на самом деле.

При операции удаления при вставе используется формат CFSTR_PREFERREDDROPFORMAT, чтобы указать целевому объекту, был ли вырезан или скопирован источник. С помощью операции перетаскивания можно использовать CFSTR_PREFERREDDROPFORMAT для указания действия оболочки. Если этот формат отсутствует, оболочка выполняет действие по умолчанию на основе контекста. Например, если пользователь перетаскивает файл из одного тома и сбрасывает его на другой, действие оболочки по умолчанию — копирование файла. Включив формат CFSTR_PREFERREDDROPFORMAT в объект данных, можно переопределить действие по умолчанию и явно сообщить оболочке о копировании, перемещении или связывании файла. Если пользователь выбирает перетаскивание с правой кнопкой, CFSTR_PREFERREDDROPFORMAT указывает команду по умолчанию в контекстном меню перетаскивания . Пользователь по-прежнему может выбирать другие команды в меню.

До версии Microsoft Internet Обозреватель 4.0 приложение указывало, что оно передает типы файлов ярлыков, задав FD_LINKUI в элементе dwFlags структуры FILEDESCRIPTOR. Затем целевым объектам пришлось использовать потенциально трудоемкий вызов IDataObject::GetData , чтобы узнать, установлен ли флаг FD_LINKUI. Теперь предпочтительным способом указать, что ярлыки передаются, является использование формата CFSTR_PREFERREDDROPEFFECT DROPEFFECT_LINK. Однако для обеспечения обратной совместимости с более старыми системами источники должны по-прежнему устанавливать флаг FD_LINKUI.

CFSTR_TARGETCLSID

Этот идентификатор формата используется целевым объектом для предоставления его идентификатора CLSID источнику. Данные являются структурой STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на ИДЕНТИФИКАТОР GUID CLSID целевого объекта удаления.

Этот формат используется в основном для удаления объектов путем их перетаскивания в корзину. При удалении объекта в корзину вызывается метод IDataObject::SetData источника с CFSTR_TARGETCLSID форматом CLSID корзины (CLSID_RecycleBin). Затем источник может удалить исходный объект.

CFSTR_UNTRUSTEDDRAGDROP

Этот идентификатор формата используется Windows Internet Обозреватель и оболочкой Windows для предоставления механизма блокировки или запроса операций перетаскивания, исходящих из Интернета Обозреватель в сочетании с флагом URLACTION_SHELL_ENHANCED_DRAGDROP_SECURITY.

CFSTR_UNTRUSTEDDRAGDROP добавляется источником операции перетаскивания, чтобы указать, что объект данных может содержать ненадежные данные. Данные представлены структурой STGMEDIUM , содержащей глобальный объект памяти. Элемент hGlobal структуры указывает на параметр DWORD с соответствующим флагом действия URL-адреса, чтобы политика проверка с помощью метода IInternetSecurityManager::P rocessUrlAction с помощью флага PUAF_ENFORCERESTRICTED.

ПеретаскиваниеWindow

Этот формат используется в операции перетаскивания для идентификации изображения (окна) объекта, чтобы его визуальные сведения можно было обновлять динамически. Когда объект перетаскивается по целевому объекту, приложение обновляет свою структуру DROPDESCRIPTION в ответ на метод IDropTarget::D ragOver или IDropSource::GiveFeedback . ФУНКЦИЯ DROPDESCRIPTION обновляется новым значением DROPIMAGETYPE, которое указывает на оформление, которое будет применено к визуальному элементу окна перетаскивания; например, указывает, что файл копируется, а не перемещается или объект не может быть удален в это расположение. Однако до тех пор, пока объект не получит сообщение DDWM_UPDATEWINDOW , визуальные элементы не обновляются. Этот формат предоставляет HWND окна перетаскивания получателя отправителю сообщения DDWM_UPDATEWINDOW .

Данные буфера обмена типы TYMED_HGLOBAL. Это представление HWND в формате DWORD. Данные можно передать в функцию ULongToHandle , определенную в Basetsd.h, для предоставления 64-разрядного HWND для использования в 64-разрядной версии Windows.

Этот формат не требует включения Shlobj.h.