«Очень важно не прерывать вопросов. Любопытство имеет свое право на существование»
52. Импорт библиотеки типов
Следующий текст взят из DG.PDF для Delphi6.
Для того чтобы сделать доступной информацию о каком-либо сервере, имеющемся в системе, необходимо импортировать его библиотеку типов.
Есть следующие пути для достижения этой цели:
1. Использование (в IDE Delphi6) диалога Project | Import Type Library для импорта всей доступной информации о типах, объектах и интерфейсах серверов. Это самый предпочтительный способ, так как он позволяет не только импортировать необходимые описания в удобной форме, но также позволяет, при необходимости, генерировать оболочки компонентов для всех соклассов библиотеки, которые не имеют атрибутов Hidden, Restricted или PreDeclID.
2. Использование (в IDE Delphi6) диалога Component | Import ActiveX Control. При этом импортируется такая же информация, как и в предыдущем способе, но оболочки компонентов генерируются для соклассов библиотеки, которые представляют собой элементы ActiveX.
3. Использование утилиты tlibimp.exe, входящей в поставку Delphi, которая предоставляет дополнительные возможности по управлению процессом генерации выходного файла по сравнению с IDE.
Независимо от применяемого способа импорта всегда создается файл с именем TypeLibName_TLB.PAS, где TypeLibName – имя библиотеки типов. Этот файл будет выглядеть так же как и файл, полученный с помощью мастера Delphi – редактора библиотеки типов. Этот файл может повторно создаваться IDE, но вносить в него изменения вручную не рекомендуется.
В дополнение к информации о типах в файле TypeLibName_TLB.PAS могут быть созданы также оболочки (VCL class wrappers) для всех соклассов, имеющихся в библиотеке. Заметим, что при использовании диалога Component | Import ActiveX Control эти оболочки создаются всегда. Если сокласс поддерживает интерфейсы событий, то оболочка создает источник для этого события (event sink), так что можно можно создать свой обработчик этого события так же просто, как это делается для обычных компонент.
Замечание. Для событий объектов COM+ оболочка автоматически не создается. Процесс ее создания в таких случаях описан в “Handling COM+ events” на стр. 35-14 DG.pdf. Более подробную информацию о генерации кода при импортировании библиотеки типов можно найти в разделе “Code generated when you import type library information” на стр. 35-5 DG.pdf.
Утилита TLibImp.exe. Программа TLibImp позволяет генерировать описание библиотеки типов на языке Object Pascal на основе данных, содержащихся в EXE, DLL, OCX или OLB файлах, реализующих СОМ объекты. Формат командной строки:
Usage: TLIBIMP [options] <typelibfile> [options]
- A<suffix> TypeLibrary file suffix (defaults to '_TLB', - A - : no suffix)
- D<path> Output directory
- F<filename> TypeLibrary Output filename (extension ignored)
- N<namespace> C++ namespace name
- X<filename> OCX Wrappers Output filename (extension ignored - C++ only)
Switches: -<letter><state> (defaults are shown below)
- C- Generate C++ import file
- E+ Generate wrapper class for dispinterfaces (C++ only)
- G+ Expose namespace with 'using' statement
- H+ Generate IDE component wrappers for ActiveX Controls
- J- Generate CORBA IDL source file
- K- Generate Pascal CORBA Stubs and Skeletons
- L- Generate IDE component wrappers for OLE Servers
- O+ Generate CoClass Creator wrappers
- P+ Generate Pascal import file
- Q+ Generate 'Register' function for IDE components wrappers
- R+ Generate files for dependent typelibraries
- S+ Map HRESULT stdcall to safecall on dual interfaces (Delphi only)
- T- Map HRESULT stdcall to safecall on all interfaces (Delphi only)
- V- Generate Event wrappers for Server (C++ only)
- W+ Warnings in import file
Пример использования утилиты TLibImp.exe. Для получения паскаль-реализации библиотеки типов, предоставляемой текстовым процессором Microsoft Word, надо выполнить такую команду:
TLibImp MSWord9.olb
В результате будут получены такие файлы:
Office_TLB.dcr
Office_TLB.pas
VBIDE_TLB.dcr
VBIDE_TLB.pas
Word_TLB.dcr
Word_TLB.pas
Теперь осталось только подключить файл Word_TLB.pas к нашему приложению и воспользоваться его описаниями для получения доступа к сервисам редактора Word.
Импорт библиотеки типов из системного реестра. Утилита OLE View позволяет, помимо просмотра реестра, экспортировать зарегистрированные библиотеки типов в любом из следующих форматов:
· на языке описания интерфейсов IDL (Interface Definition Language), т.е. в файле с расширением .idl;
· на языке С (.c) с идентификаторами UUID;
· в формате заголовочного файла (.h).
Visual C++ также предоставляет компилятор (MIDL.exe), который и используется утилитой OLE View для генерации файлов двух последних типов (.c, .h).
Регистрация сервера с помощью утилиты RegSvr32. Напомним, что каждая DLL библиотека, включающая внутрипроцессный сервер, экспортирует функции DllRegisterServer и DllUnregisterServer, предназначенные для регистрации и разрегистрации сервера соответственно. Эти функции вызываются Delphi при выполнении меню Run|Register ActiveX Server и Run|Unregister ActiveX Server. Эти же функции могут быть вызваны и без Delphi с помощью программы regsvr32, входящей в Windows, или с помощью программы TRegsvr, входящей в комплект поставки Delphi.
Синтаксис использования утилиты RegSvr32 с помощью командной строки (Пуск|Выполнить) таков:
regsvr32 [флаг1 [флаг2 ...] имяDll
Флаги обозначают следующее:
/u
Разрегистрация библиотеки. Если флаг /i не указан, то вызывается функция DllUnregisterServer библиотеки.
/i:"string"
В этом случае вызывается функция библиотеки DllInstall. Если флаг /u указан, то функция DllInstall вызывается с первым параметром, равным false, что означает просто разрегистрацию библиотеки. В противном случае первому параметру DllInstall присваивается значение true и функция будет регистрировать библиотеку. Заданная в этом параметре строка string будет в этом случае передана в качестве второго параметра в DllInstall. Если строка не указана, то значение второго параметра – NULL. Если флаг /n не указан, то во всех случаях функции DllRegisterServer или DllUnregisterServer будут также вызваны. Значение, вкладываемое в параметр string, зависит от разработчика библиотеки. С его помощью могут быть реализованы специфические процедуры, связанные с установкой библиотеки.
/n
Указывает на то, что функции DllRegisterServer или DllUnregisterServer вызываться не должны. Этот флаг можно использовать только в комбинации с флагом /i.
/s
Подавляет вывод сообщения о регистрации сервера или разрегистрации.
/c
Консольный вывод сообщений RegSvr32.
Если не указан ни один флаг, то библиотека будет зарегистрирована путем вызова экспортируемой ее же функции DllRegisterServer. Например, такой вызов утилиты
regsvr32 dllname.dll
просто зарегистрирует сервер dllname.dll.
Для разрегистрации библиотеки без вызова функции DllUnregister надо использовать такую командную строку
regsvr32 /u /n /i:"uninstall_1" dllname.dll
Это эквивалентно такому вызову DllInstall(false, "uninstall_1") функции DllInstall и в этом случае функция DllUnregisterServer автоматически вызываться не будет.
Borland TLIBIMP Version 5.0 Copyright (c) 1997, 1999 Inprise Corporation
C:\Program Files\Borland\Delphi6\Bin>type idl2pas.bat
echo off
rem jre.exe should be in your path and - cp should be set to the location of idl2
pas.jar.
rem -mxNumber is the max heap size. This can be increased if the jvm runs out of
heap.
echo on
java -mx40000000 - cp "C:\Program Files\Borland\Delphi6\Bin\idl2pas.jar" com.inpr
ise.vbroker.compiler.tools.idl2pas %1 %2 %3 %4 %5 %6 %7 %8 %9
«51. Разработка клиентских приложений»
53. Алгоритм взаимодействия клиент-сервер