Type 89 (БМП)
- 1 year ago
- 0
- 0
TLB ( англ. T ype L i b rary — библиотека типов) — иерархическое хранилище информации о возможностях ActiveX-сервера в OLE Automation.
Библиотека типов — одно из ключевых понятий технологии OLE Automation . Библиотека типов представляет собой иерархическое (трёхуровневое, считая корневой элемент) хранилище информации о возможностях ActiveX -сервера. Чаще всего библиотека типов хранится либо как отдельный файл с расширением «.tlb» или «.olb», либо внутри (в ресурсах ) ActiveX-компонента , который она описывает. Кроме того, библиотека типов может находиться в составном документе OLE.
С появлением технологии ActiveX возникла необходимость в наличии единого рекомендованного способа получения подробных сведений об ActiveX-компоненте: списка реализуемых им классов и поддерживаемых интерфейсов , их идентификаторов, кратких описаний и прочего. С этой целью и были введены библиотеки типов.
Библиотека типов является трёхуровневым иерархическим хранилищем: вершиной иерархии является сама библиотека ( англ. Type Library ), представляющая собой набор типоописаний ( англ. Type Info ), являющихся, в свою очередь, контейнерами элементов третьего уровня — членов ( англ. Member ).
Все три типа элементов имеют одинаковый набор базовых характеристик:
Кроме того, библиотека и типоописания имеют уникальные 128-битные идентификаторы , а члены — 32-битные (уникальные в пределах одного типоописания). Идентификатор библиотеки называется LIBID , члена — MEMBERID . Название идентификатора типоописания зависит от вида типоописания.
В библиотеке типов могут описываться сущности восьми различных видов. Каждое типоописание определяет одну из них. В соответствии с этим, атрибутом типоописания, имеющим первостепенную важность при разборе типоописания, является вид типоописания ( англ. Type Kind ). Этот атрибут устанавливает вид сущности, описываемой данным типоописанием, и, тем самым, задаёт способ интерпретации всех прочих параметров и подчинённых элементов типоописания.
Следующая таблица показывает возможные виды сущностей:
Сущность | Члены | Type Kind | Название идентификатора |
---|---|---|---|
Перечисление (Enum) | Константы | TKIND_ENUM | — |
Объединение (Union) | Поля объединения | TKIND_UNION | — |
Структура | Поля структуры | TKIND_RECORD | — |
COM-интерфейс |
Методы
,
свойства , поля класса , |
TKIND_INTERFACE | IID (Interface ID) |
Disp-интерфейс | TKIND_DISPATCH | ||
COM-класс | Поддерживаемые COM-интерфейсы | TKIND_COCLASS | CLSID (Class ID) |
— | TKIND_ALIAS | — | |
Обычный модуль |
Функции
,
свойства, переменные |
TKIND_MODULE | — |
TLB содержит ряд важной информации, необходимой как при разработке, так и в процессе работы приложений.
C точки зрения хранимых сведений, библиотека является более продвинутым аналогом заголовочных файлов .
OLE API предлагает функции , позволяющие загрузить библиотеку типов и работать с ней через интерфейсы ITypeLib и ITypeLib2, а с хранящимися в ней сущностями — через ITypeInfo и ITypeInfo2.
Для Visual Basic поддержка TLB является естественной и неотъемлемой, так как это единственный механизм, позволяющий привнести в пространство имён проекта информацию об уже существующих интерфейсах, классах, типах: язык позволяет объявлять свои, новые интерфейсы и классы, но не уже существующие . Так, например, большинство «встроенных» функций, типов, классов и интерфейсов языка объявлены в соответствующих библиотеках типов.
Библиотека типов подключается к проекту через Project→References (или косвенно, через Project→Components). Несколько «базовых» библиотек подключены изначально и не поддаются отключению.
MSVC++ дополнен специальной директивой препроцессора #import , создающей для подключаемой библиотеки типов отдельное пространство имён , а для каждой описанной в библиотеке сущности — соответствующее C++-совместимое объявление.
Пример:
// Импорт библиотеки типов по имени tlb-файла
#import "../tlb/foobar.tlb"
// Импорт библиотеки типов из ресурсов PE-файла
#import "winhttp.dll"
// Импорт библиотеки по её LIBID'у
#import "libid:12341234-1234-1234-1234-123412341234"
В этих средах разработки имеется мастер импорта компонентов ( англ. Import Component Wizard ), доступный через меню Component→Import Component, позволяющий сгенерировать на основе библиотеки типов соответствующий pas- или h-файл с объявлениями.
В PHP имеется функция , которая загружает библиотеку типов и регистрирует в пространстве имён PHP константы из этой библиотеки. Функция выводит адаптированный дамп типоописания указанного класса/интерфейса.
OLE API предоставляет функции CreateTypeLib, CreateTypeLib2, интерфейсы ICreateTypeLib, ICreateTypeLib2, ICreateTypeInfo, ICreateTypeInfo2, с помощью которых задача создания и сохранения произвольной библиотеки типов решается программно. Разработчики могут создавать свои собственные приложения для создания библиотек типов, пользуясь этими API-функциями и интерфейсами.
Для разработки библиотек типов Microsoft создала специальный язык MIDL . Исходные файлы, написанные на этом языке, компилируются с помощью одноимённой утилиты-компилятора midl.exe . Раньше для этих целей использовался mktyplib.exe , который в данное время считается устаревшим и не рекомендован к использованию. Существует значительная разница между требованиями этих двух утилит к входным данным: далеко не всякий код, верный для первого, будет верен для второго, и наоборот .
[
odl,
uuid(D8F015C0-C278-11CE-A49E-444553540000),
helpstring("Definition of interface IShellDispatch"),
hidden,
dual,
oleautomation
]
interface IShellDispatch : IDispatch {
[id(0x60020000), propget, helpstring("Get Application object")]
HRESULT Application([out, retval] IDispatch** ppid);
[id(0x60020001), propget, helpstring("Get Parent object")]
HRESULT Parent([out, retval] IDispatch** ppid);
[id(0x60020002), helpstring("Get special folder from ShellSpecialFolderConstants")]
HRESULT NameSpace(
[in] VARIANT vDir,
[out, retval] Folder** ppsdf);
[id(0x60020003), helpstring("Browse the name space for a Folder")]
HRESULT BrowseForFolder(
[in] long Hwnd,
[in] BSTR Title,
[in] long Options,
[in, optional] VARIANT RootFolder,
[out, retval] Folder** ppsdf);
[id(0x60020004), helpstring("The collection of open folder windows")]
HRESULT Windows([out, retval] IDispatch** ppid);
[id(0x60020005), helpstring("Open a folder")]
HRESULT Open([in] VARIANT vDir);
[id(0x60020006), helpstring("Explore a folder")]
HRESULT Explore([in] VARIANT vDir);
[id(0x60020007), helpstring("Minimize all windows")]
HRESULT MinimizeAll();
[id(0x60020008), helpstring("Undo Minimize All")]
HRESULT UndoMinimizeALL();
[id(0x60020009), helpstring("Bring up the file run")]
HRESULT FileRun();
[id(0x6002000a), helpstring("Cascade Windows")]
HRESULT CascadeWindows();
[id(0x6002000b), helpstring("Tile windows vertically")]
HRESULT TileVertically();
[id(0x6002000c), helpstring("Tile windows horizontally")]
HRESULT TileHorizontally();
[id(0x6002000d), helpstring("Exit Windows")]
HRESULT ShutdownWindows();
[id(0x6002000e), helpstring("Suspend the pc")]
HRESULT Suspend();
[id(0x6002000f), helpstring("Eject the pc")]
HRESULT EjectPC();
[id(0x60020010), helpstring("Bring up the Set time dialog")]
HRESULT SetTime();
[id(0x60020011), helpstring("Handle Tray properties")]
HRESULT TrayProperties();
[id(0x60020012), helpstring("Display shell help")]
HRESULT Help();
[id(0x60020013), helpstring("Find Files")]
HRESULT FindFiles();
[id(0x60020014), helpstring("Find a computer")]
HRESULT FindComputer();
[id(0x60020015), helpstring("Refresh the menu")]
HRESULT RefreshMenu();
[id(0x60020016), helpstring("Run a Control Panel Item")]
HRESULT ControlPanelItem([in] BSTR szDir);
Формат файла библиотеки типов предусматривают возможность расширения набора хранимых в библиотеке сведений. Для того, чтобы сохранить в библиотеке некоторую информацию, хранение которой изначально не предусмотрено, существует возможность снабдить любой элемент иерархии (библиотеку, типоописание, член), а также параметр метода/функции блоком произвольных данных ( англ. Custom Data ).
Microsoft не устанавливает какого-либо формата блока произвольных данных — это могут быть любые данные, способные быть сохранёнными в Variant-переменной. При таком подходе возможны ситуации, когда разные разработчики будут использовать эту возможность для различных целей, что привело бы к многочисленным проблемам несовместимости. Чтобы подобных коллизий не возникало, при сохранении и получении произвольных данных необходимо указывать уникальный идентификатор (GUID), который однозначно определяет смысл блока произвольных данных и, как следствие, его формат.
Таким образом, любой элемент может быть снабжён не одним, а несколькими блоками произвольных данных, причём разные блоки могут быть оставлены разными программами и служить совершенно разным целям.
На практике, библиотеки типов, в которых бы использовалась эта возможность, встречаются крайне редко.
Следующие утилиты могут быть использованы при работе с библиотеками типов:
При разработке в среде Visual Basic библиотеки типов нередко используются не по своему прямому назначению, а для осуществления раннего импорта обычных WinAPI -функций , как единственно возможный в VB вариант осуществления импорта через таблицу импорта.
...
typedef struct tagCOMBOBOXEXITEMA
{
ComboBoxExItemMaskFlags mask;
int iItem;
int pszText;
int cchTextMax;
int iImage;
int iSelectedImage;
int iOverlay;
int iIndent;
LPARAM lParam;
} COMBOBOXEXITEMA, *PCOMBOBOXEXITEMA;
[dllname("comctl32.dll")]
module ComCtl
{
[entry("InitCommonControlsEx")]
int InitCommonControlsEx(LPINITCOMMONCONTROLSEX lpInitCtrls);
[entry("ImageList_ReplaceIcon")]
int ImageList_ReplaceIcon(HIMAGELIST himl, int i, HICON hicon);
}
[dllname("user32.dll")]
module IconsAPI
{
[entry("LoadImageW")]
int LoadImage(int hinst, void* lpszName, int uType, int cxDesired, int cyDesired, int fuLoad);
}
...