На этом шаге мы рассмотрим работу с библиотекой типов.
Вы, наверное, уже поняли, что диспетчерский механизм - относительно медленный способ обмена данными между сервером и клиентом. Кроме того, упаковка/распаковка параметров в/из переменных VARIANT небезопасна с точки зрения сохранения типа. Высокоэффективные языки разработки типа Visual Basic 6.0 должны обращаться к методам интерфейса напрямую через vtable.
Для этого клиенту Visual Basic необходимо знать номер и типы параметров, ожидаемых методами интерфейса. Эти сведения предаставляются клиенту в библиотеке типов (type library) - двоичном oписании параметров и методов интерфейса, а также параметров метода. Библиотеку типов можно рассматривать как откомпилированную независимую от языка версию заголовочного файла C++.
Среда Visual Basic считывает библиотеку типов и предоставляет описание интерфейса программисту. Тот создает экземпляр компонента, используя синтаксис Visual Basic для прямого доступа к vtable компонента. Сведения, полученные из библиотеки типов, позволяют разработчику передавать в методы интерфейса параметры корректных типов. Таким образом, в Visual Basic обходят диспетчерский механизм и повышают производительность, применив сервер, встраиваемый в процесс. Как Вы помните, создавая доступный клиенту Visual Basic компонент, нужно использовать исключительно типы данных, поддерживаемые Automation. Библиотека типов описана с применением IDL.
MIDL-компилятор создает файл библиотеки типов с расширением *.tlb, который зачастую компонуется вместе с DLL- или ЕХЕ-сервером COM-компонента.
Чтобы клиенты, написанные на языках типа Visual Basic, получили доступ к Вашей библиотеке типов, в реестр необходимо внести некоторые записи, относящиеся к СОМ-объекту. Они позволят библиотеке СОМ найти созданную Вами библиотеку типов.
На рисунке 1 показана схема записей в реестре, относящихся к COМ-объекту, поддерживающему библиотеку типов.
Рис.1. Записи реестра для библиотеки типов
Практически для нахождения библиотеки типов достаточно всего лишь двух записей. В разделе CLSID Вашего объекта нужно добавить подраздел TypeLib, которому присваивается значение идентификатоpa LIBID библиотеки типа - ее GUID, указанный в файле IDL.
Этот же идентификатор LIBID является именем второго подраздела, который надо создать в разделе HKEY_CLASSES_ROOT\TypeLib. Как видно из рисунка 1, в этом разделе есть еще несколько подразделов. Например, в win32 задается путь к файлу библиотеки типов:
Win32 = c:\Encoder\debug\Encoder.dll
Выражение, следующее за знаком равенства, есть не что иное, как путь к физическому местонахождению этого файла. В данном случае он скомпонован в одну DLL с СОМ-сервером. Приложения, использующие библиотеки типа, умеют считывать их из DLL- и ЕХЕ-файлов.
Когда Вы ссылаетесь в Visual Basic на СОМ-компонент, среда программирования использует эту информацию для нахождения пути к файлу библиотеки типа. Получив его, Visual Basic считывает и анализирует библиотеку типов, создает программное представление и дает возможность писать и исполнять код, пользующийся услугами СОМ-сервера.
На следующем шаге мы рассмотрим двойные интерфейсы.