Итак, подробнее о СОМ и языковой независимости. Как известно, СОМ - это не язык программирования. Компоненты СОМ могут быть написаны на любом языке, поддерживающем СОМ. Но компоненты СОМ должны не только позволять создавать себя на любом языке, они должны быть доступны из любого СОМ-совместимого языка. Например, разработчики Web-приложений могут применять язык VBScript для доступа к СОМ-объектам, написанным на Delphi. Но как быть с проблемой различных базовых типов? Ведь базовые типы одного языка (например, char, int, float) не всегда совместимы с базовыми типами другого или даже не имеют аналога в другом языке. Например, тип String - строка в Visual Basic - не имеет аналога в С/С++, и вообще, в классическом С/С++ (без использования шаблонов) нет такого типа "строка". Строки представляются как массив символов, завершающийся '\0'. Типы С++, на котором изначально была разработана модель СОМ, не переносятся явно в другие языки.
Чтобы разрешить эту проблему, Microsoft разработала набор
универсальных типов данных IDL, понятных любому языку. (IDL - Interface Definition Language). Этот набор универсальных типов данных IDL построен по принципу базового типа VB - типа
Variant, играющего в СОМ (а не только в VB) ключевую роль. Все, что можно описать с помощью Variant в VB, можно также представить и соответствующими типами IDL, которые называются Variant-совместимыми типами. Этот набор типов может представлять не только типы, присутствующие в большинстве языков (boolean, short и т.д.), но и новые типы, изначально не поддерживаемые С/С++, например, тип BSTR (Basic String). Тип BSTR - это строка Unicode фиксированной длины с NULL на конце, и этот тип Visual Basic поддерживает явно, а не через вызовы функций API (как это пришлось сделать в С++, чтобы он мог работать с Unicode).
Таким образом, если вы программируете на любом языке, который поддерживает COM, и хотите, чтобы ваши двоичные объекты можно было использовать из других языков, то вы должны задавать параметрам в разработанных вами методах классов Variant-совместимые типы. Используя Variant-совместимые типы, вы не только предоставляете
языковую независимость клиентским программам, но и получаете еще одно преимущество:
автоматическую поддержку маршалинга (то есть СОМ-клиент сможет обращаться к СОМ-серверу, расположенному на том же самом или даже на удаленном компьютере в сети). Если же Variant-совместимый тип не будет использован, то доступ к созданному двоичному объекту в памяти из другого процесса не будет возможен. Максимум, что можно получить в таком случае - это подгружаемую в процесс клиента библиотеку dll (к которой еще надо уметь обратиться с помощью громоздких функций-оберток, специфических для каждого языка, если ваша программа написана на другом языке, чем dll-библиотека).
Конечно, за все надо платить - и расплатой за универсальность типа Variant является повышенный расход памяти (данные размером даже один байт все равно будут использовать все 32 бита). Но Microsoft еще в 1993 г. предвидела, что память будет дешеветь при одновременном значительном росте ее объема даже на low-end машинах. И опять же, при создании Visual Basic'a программистам был сделан настоящий подарок: предоставлена возможность использовать строгий контроль типов в программах по собственному желанию разработчика. Достаточно всего одной таблэтки...
то есть, я хочу сказать, всего лишь одной строки директивы Option Explicit в начале кода программы - и в IDE Visual Basic будет включен строгий контроль всех используемых типов, и можно легко отказаться от использования типа Variant. И пожалуйста, можете экономить память, если она для вас так критична.
P.S. А в языке VBScript - этом "младшем брате" Visual Basic'a, предназначенном для программирования web-страниц, решили пойти еще дальше! Там используется всего лишь один тип Variant, других типов там вообще нет!
Вот почему там можно обращаться к объектам COM, написанным на Delphi (или на других СОМ-совместимых языках), о чем я говорил в начале.
Сообщение отредактировал Visual1: 07.09.2006, 23:05:40