Форматы данных и носители передачи

Большинство платформ, включая Windows, определяют стандартный протокол для передачи данных между приложениями на основе набора функций, называемых буфером обмена. Приложения, использующие эти функции, могут совместно использовать данные, даже если их собственные форматы данных являются дико разными. Как правило, эти буферы обмена имеют два существенных недостатка, которые COM преодолел.

Во-первых, описания данных используют только идентификатор формата, например один 16-разрядный идентификатор формата буфера обмена в Windows, что означает, что буфер обмена может описать только структуру своих данных, то есть порядок битов. Он может сообщать: "У меня есть растровое изображение", "или у меня есть текст", но он не может указывать целевые устройства, для которых создаются данные, какие представления или аспекты самой данных могут предоставлять, или какие носители хранения лучше всего подходят для его передачи. Например, он не может сообщить: "У меня есть строка текста, который хранится в глобальной памяти и отформатирован для презентации на экране или на принтере" или "У меня есть точечный рисунок эскиза, отрисованный для принтера 100 точек в матрице и хранящийся в виде файла диска".

Во-вторых, все передачи данных с помощью буфера обмена обычно происходят через глобальную память. Использование глобальной памяти достаточно эффективно для небольших объемов данных, но ужасно неэффективно для больших объемов, таких как 20 МБ мультимедийный объект. Глобальная память замедляется для большого объекта данных, размер которого требует значительного переключения на виртуальную память на диске. В случаях, когда обмен данными будет находиться в основном на диске в любом случае, принудив его через это узкое место виртуальной памяти, является очень неэффективным. Лучший способ пропускать глобальную память полностью и просто передавать данные непосредственно на диск.

Для устранения этих проблем COM предоставляет две структуры данных: FORMATETC и STGMEDIUM. Дополнительные сведения см. в следующих разделах:

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