Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Роджерсон Д. - Основы COM - 2000.pdf
Скачиваний:
412
Добавлен:
13.08.2013
Размер:
2.4 Mб
Скачать

197

HKEY_CLASSES_ROOT\

Interfaces\

{32BB8326-B41B-11CF-A6BB-0080C7B2D682}\

ProxyStubClsid32

В этом разделе должен находиться следующий CLSID:

{00020424-0000-0000-C000-000000000046}

Теперь найдем этот CLSID в разделе Реестра CLSID:

HKEY_CLASSES_ROOT\ CLSID\

{00020424-0000-0000-C000-000000000046}\ InprocServer32

Вы увидите, что значением InprocServer32 является OLEAUT32.DLL

Что Вы хотите сделать сегодня?

Теперь Вы это получили: есть еще один способ коммуникации между клиентом и компонентом. Как обычно, если одно и то же можно сделать по-разному, Вы должны решить, что выбрать. Есть три варианта: интерфейсы vtbl, дуальные интерфейсы и disp-интерфейсы. Какой из них подойдет Вам? Как в таких случаях говорит мой отец: «С одной стороны шесть, с другой полдюжины». Есть, однако, вполне четкие рекомендации, какой тип интерфейса кода следует использовать.

Если доступ к Вашему компоненту будет осуществляться только из компилируемых языков типа С и С++, используйте vtbl или нормальный интерфейс СОМ. Интерфейсы vtbl работают значительно быстрее dispинтерфейсов. Кроме того, с ними гораздо легче работать на С++. Если к Вашему компоненту будут обращаться из Visual Basic или Java, следует реализовать дуальный интерфейс. Visual Basic и Java могут работать с ним либо как с disp-интерфейсом, либо через vtbl. На С++ также можно будет использовать оба эти способа.

Однако реализованная с помощью vtbl часть дуального интерфейса, который разработан специально для использования Visual Basic, вряд ли осчастливит большинство программистов на С++ (если только Вы не используете расширения компилятора Visual C++ 5.0). В связи с этим я рекомендую разработать низкоуровневый интерфейс vtbl и высокоуровневый дуальный интерфейс. Низкоуровневый интерфейс способен дать программисту на С++ дополнительную информацию, необходимую для эффективного агрегирования компонента.

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

Кроме того, есть еще один фактор, влияющий на Ваше решение, — скорость. Если Вы имеете дело с компонентом внутри процесса, интерфейс vtbl работает примерно в 100 раз быстрее disp-интерфейса. (Точное значение несколько меняется в зависимости от набора типов аргументов функций.) В случае же компонента вне процесса накладные расходы маршалинга более существенны, чем накладные расходы IDispatch::Invoke, и интерфейс vtbl работает примерно лишь в два с половиной раза быстрее disp-интерфейса. Если же Ваш компонент является удаленным, то тип используемого интерфейса вообще не имеет значения.

Соседние файлы в предмете Программирование на C++