Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Организация зап... 64672
Создание потоко... 62401
Модуль Forms 61256
Создание отчето... 61227
ТЕХНОЛОГИИ ДОСТ... 57679
Пример работы с... 55199
Имитационное мо... 53079
Реклама
Сейчас на сайте
Гостей: 5
На сайте нет зарегистрированных пользователей

Пользователей: 13,067
новичок: senata7
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Меры близости на векторах в Delphi + Блок схемы
Моделирование процесса передачи данных по магистрали с основным и резерв...
Программа тестирования и обучающая программа по математике на Turbo Pasc...

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Классы и IDL



Как уже отмечалось в начале этой главы, СОМ рассматривает интерфейсы и классы как отдельные сущности. В свете этого классы СОМ (а равно и интерфейсы СОМ) должны быть определены в IDL с целью обеспечить независимое от языка описание конкретных типов данных, которые может экспортировать сервер. IDL-определение класса СОМ содержит список интерфейсов, которые экспортируются элементами класса, исключая катастрофический сбой:
[uuid(753A8A7D-A7FF-11d0-8C30-0080C73925BA)]
coclass Gorilla { interface IApe; interface IWarrior; }



IDL -определения коклассов ( coclass ) всегда появляются в контексте определения библиотеки ( library definition ). В IDL определения библиотек используются для группирования набора типов данных (например, интерфейсы, коклассы, определения типов) в логический блок или пространство имен. Все типы данных, появляющиеся в контексте определения библиотеки IDL, будут отмечены в результирующей библиотеке типов. Библиотеки типов используются вместо IDL-файлов такими средами, как Visual Basic и Java.
Как правило, IDL-файл может содержать один библиотечный оператор, и все типы данных, определенные или использованные внутри определения библиотек, появятся в генерируемой библиотеке типа:
// apes.idl // bring in IDL definitions of ape interfaces
// введем IDL-определения интерфейсов обезьян
import «apeitfs.idl»;
[ uuid(753A8A80-A7FF-11d0-8C30-0080C73925BA),
// LIBID – идентификатор библиотеки version(1.0),
// version number of library – номер версии библиотеки
lcid(9),
// locale ID of library (english)
// код локализации библиотеки (english)
helpstring(«Library of the Apes»)
// title of library – заголовок библиотеки
]
library ApeLib { importlib(«stdole32.tlb»);
// bring in std defs. – вносим стандартные опредепения
[uuid(753A8A7D-A7FF-11d0-8C30-0080C73925BA)] coclass Gorilla {
[default] interface IApe;
interface IWarrior; }
[uuid(753A8A7E-A7FF-11d0-8C30-0080C73925BA)] coclass Chimpanzee {
[default] interface IApe;
interface IEgghead; }
[uuid(753A8A7F-A7FF-11d0-8C30-O080C73925BA)] coclass Orangutan {
[default] interface IApe;
interface IKeeperOfTheFaith; } }



Атрибут [default] показывает, какой из интерфейсов наиболее близко представляет внутренний тип класса. В тех языках, которые распознают этот атрибут, [default] позволяет программисту объявлять ссылки объекта, используя только имя кокласса СОМ:
Dim ursus as Gorilla



Исходя из IDL-определения для Gorilla , данный оператор эквивалентен следующему:
Dim ursus as IApe



поскольку IApe является интерфейсом по умолчанию для класса Gorilla . В любом случае программист мог вызывать методы EatBanana и SwingFromTree с переменной ursus . Если атрибут [default] не указан, то он неявно добавляется к первому интерфейсу в определении coclass .
Имея указанное выше библиотечное определение IDL, результирующий заголовочный файл apes.h будет использовать препроцессор С для включения файла apesitfs.h . Этот файл apesitfs.h будет содержать определения абстрактных базовых классов для четырех интерфейсов СОМ IApe , IWarrior , IKeeperOfTheFaith и IEgghead . Кроме того, файл apes.h будет содержать объявления GUID для каждого класса:
extern "С" const CLSID CLSID_Gorilla;
extern "С" const CLSID CLSID_Chimpanzee;
extern "С" const CLSID CLSID_Orangutan;



Соответствующий файл apes_i.с будет содержать определения этих CLSID . Сгенерированная библиотека типов apes.tlb будет содержать описания каждого из интерфейсов и классов, что позволит программисту на Visual Basic написать следующее:
Dim ape As IApe
Dim warrior as IWarrior
Set ape = New Gorilla
' ask СОМ for a new gorilla
' запрашиваем СОМ о новой
gorilla Set warrior = ape



А вот так выглядит Java-версия того же самого кода:
IАре аре;
IWarrior warrior;
аре = new Gorilla();
// no cast needed for [default]
// никаких приведений не требуется для [default] ???
warrior = (IWarrior)ape;



Оба этих фрагмента кода предписывают виртуальной машине использовать CLSID_Gorilla для сообщения CoCreateInstanceEx о том, какой тип объекта нужно создать.
В предыдущем IDL на каждый из интерфейсов IApe , IWarrior , IEgghead и IKeeperOfTheFaith есть ссылки из определения библиотеки. По этой причине их определения присутствуют в генерируемой библиотеке типов, несмотря та то, что они определены вне области действия определения библиотеки. В действительности любые типы данных, используемые как параметры или как базовые интерфейсы для данных интерфейсов, будут в то же время присутствовать в генерируемой библиотеке. Существует хорошая практика – определять оператор с реализацией библиотеки в отдельном IDL-файле, который импортирует все необходимые определения интерфейсов из внешнего IDL-файла, содержащего только описания интерфейсов. Такая практика является обязательной в больших проектах со многими IDL-файлами, так как для IDL-файла, содержащего определение библиотеки, недопустимо импортировать другой IDL-файл, который также содержит определение библиотеки. Путем разделения определений библиотеки по отдельным IDL-файлам можно корректно импортировать интерфейсы, используемые библиотекой, в другие проекты, не беспокоясь о множественных определениях библиотеки. Если не использовать этот способ, то существует только одна возможность импортировать определение интерфейса из IDL-файла, содержащего определение библиотеки, – использовать директиву importlib :
// humans.idl
// apeitfs.idl DOESN'T have a library statement, so import
// apeitfs.idl HE ИМЕЕТ оператора library, поэтому импортируем
import «apeitfs.idl»;
[ uuid(753A8AC9-A7FF-11d0-8C30-0080C73925BA), version(1.0), lcld(9), helpstring(«Humans that need apes»)
// «Люди, нуждающиеся в обезьянах»
]
library HumanLib {
importlib(«stdole32.tlb»);
// bring in std defs. – вносим стандартные определения
// Dogs.idl DOES have a library definition, so importlib
// its corresponding type library
// Dogs.idl ИМЕЕТ определение библиотеки, поэтому
// импортируем библиотеку соответствующего типа
importlib(«dogs.tlb»);
[uuid(753A8AD1-A7FF-11d0-8C30-0080C73925BA)]
coclass DogApe {
interface IDog;
interface IApe;
} }



В простых проектах часто используется один IDL-файл, в котором определяются как интерфейсы, так и классы, экспортируемые из проекта. Для простых интерфейсов это имеет смысл, так как генерируемая библиотека типов будет содержать взаимно однозначные образы исходных определений IDL, что позволит пользователям этой библиотеки применять importlib без потери информации. К сожалению, в случае сложных интерфейсов многие из исходных IDL-измов (IDL-ism) теряются в результирующей библиотеке типов, и тогда importlib не будет работать так, как хотелось бы. Грядущая версия компилятора MIDL , быть может, будет способна генерировать библиотеки типов, которые будут содержать все из исходного IDL.
Опубликовал Kest July 13 2009 14:16:09 · 0 Комментариев · 6282 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Degisy Data Acces...
Эффект лампы на р...
Borland Delphi 8 ...
Защита от спама ...
Шейдеры в Delphi
Delphi. Учимся на...
Szwavepanel
CoolDev TipsSyste...
Dnavigator
Delphi 7 Enterpri...
oTextrackBar
FreeSMS v1.3.1
Crypt32
Обучение Borland ...
THttpScan v4.1
База Allsubmitter...
AJAX и PHP. разра...
Архив значков
Переработанный пл...
Delphi 2005 Учимс...

Топ загрузок
Приложение Клие... 100384
Delphi 7 Enterp... 83585
Converter AMR<-... 20051
GPSS World Stud... 11323
Borland C++Buil... 11245
Borland Delphi ... 8185
Turbo Pascal fo... 6988
Visual Studio 2... 4970
Калькулятор [Ис... 4421
FreeSMS v1.3.1 3516
Случайные статьи
Операции отношения...
Атрибуты и свойства
Где дизайнерские б...
ММ С.2.
Есть ли в Интернет...
Понятие "документ"...
Управляющие сообще...
Неупорядоченные сп...
Устраняйте причину...
• чтобы использова...
Программируемая за...
Приемы эквивалентн...
Настраиваемые типы...
Точный перечень ме...
Документируйте в п...
Язык С: типы членов
Основные препятств...
подкаталог Ех75
Определение размер...
Основные принципы ...
Анонимный доступ г...
Пример программы —...
Анимация в компьют...
OpenGL. Шесть куби...
Простой метаинтерп...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?