Библиотека типов. Новый проект.
Для того чтобы клиенты, разработанные на других языках программирования, могли управлять объектами сервера, они должны иметь информацию о типах данных, используемых сервером при передаче параметров. Одним из способов получения этой информации является создание сервером библиотеки типов. Возвращаясь к файлам, которые сгенерировал компилятор MIDL, отметим, что он создает еще один (двоичный) TLB-файл (Type Library). После успешной компиляции вы можете обнаружить его в папке Debug. COM использует этот файл для реализации маршалинга, управляемого данными, который происходит на этапе выполнения программы.
Двоичный TLB-файл воспринимается клиентом, написанным на одном из СОМ-совместимых языков. Например, его использует программа просмотра объектов Microsoft Excel. Инструмент Studio .NET ClassWizard умеет по информации из библиотеки типов создать классы, которые могут обращаться к свойствам и методам объектов. Программа на Visual Basic осуществляет раннее связывание на основе данных из библиотеки типов. Сведения о библиотеке типов также заносятся в реестр в специальный подраздел TypeLib в разделе HKEY_CLASSES_ROOT.
Новый проект
Для ознакомления с возможностями MIDL создайте новый пустой проект типа Win32 DLL. Для этого:
- Дайте команду File › New › Project. В диалоге New Project выберите шаблон Win32 Project под именем MyComTLib и нажмите ОК.,
- В окне Win32 Application Wizard откройте вкладку Application Settings, установите переключатель Application Type в положение DLL, включите флажок Empty Project и нажмите кнопку Finish.
- Дайте команду Project › Add New Item. В диалоге Add New Item выберите шаблон MIDI File(.idl), задайте имя файла MyComTLib.idl и нажмите кнопку Open.
- В окне редактора появится новый документ – заготовка описания СОМ-объекта на языке MIDL Введите в него текст, приведенный ниже:
//====== Импорт библиотечных определений import "oaidl.idl"; import "ocidl.idl"; //====== Уточненное описание интерфейса ISay [ object, uuid(170368DO-85BE-43af-AE71-053F506657A2), helpstring ("MyTest DLL COM-server ISay") ] interface ISay: lUnknown { HRESULT Say(); HRESULT SetWord([in]BSTR word); } //====== Описание библиотеки типов [ uuid (0934DA90-608D-4107-9ECC-C7E828AD0928), version (1.0), helpstring ("MyTest DLL COM-server Type Library") ] library MyCom { importlib("stdole32.tlb"); [uuid(9B865820-2FFA-lld5-98B4-OOE0293F01B2)] //====== Описание класса реализации интерфейса coclass CoSay { [default] interface ISay; }; };
Попробуйте откомпилировать новый файл описания интерфейса, используя клавиатурную комбинацию CTRL + F7. Если на этом этапе возникнут ошибки, то проверьте настройку проекта View › Property Pages › MIDL › General › MkTyре Lib Compatible (она должна быть в состоянии No) и повторите компиляцию. После успешного ее завершения просмотрите содержимое папки проекта. В ней должны появиться новые файлы: MyComTLib_h.h, MyComTLibJ.c, MyComTLib_p.c и dlldata.c. Эти файлы, как было сказано, помогают обеспечить взаимодействие клиента с сервером. В результате их компиляции и сборки будет сгенерирована DLL, в которой реализованы коды заглушек proxy/stub.
- MyComTLib_h.h содержит описания заглушек и интерфейса isay на двух языках: С и C++. Работа с указателями vtable в языке С ведется значительно более изощренным способом, чем в языке C++. В конце файла вы можете увидеть набор макросов, которые сгенерировал MIDL для упрощения этой задачи.
- MyComTLibJ.c содержит идентификаторы интерфейса, его класса и библиотеки типов. Этот файл должен быть подключен к любому программному модулю, который обращается к нашему интерфейсу ISay.
- MyComTLib_p.c содержит исходный код заглушек (proxy/stub) для интерфейса. Он, как вы помните, обеспечивает стандартный маршалинг параметров. Код достаточно замысловатый и малопонятный, но его никогда не надо корректировать.
- dlldata.c содержит несколько макросов. В результате компиляции файла dlldatax в коде DLL заглушек proxy/stub появятся функции DllMain, DllGetclassObject, DllCanUnloadNow, DllRegisterServer и DllUnRegisterServer, которые необходимы всем саморегистрирующимся DLL.
Для того чтобы двинуться дальше, вам необходимо взять некоторые файлы из папки МуСоm с предыдущим проектом типа DLL.
- Скопируйте и вставьте в папку текущего проекта файлы MyCom.h, MyCom.cpp, MyCom.reg и MyCom.def, но не переносите файл interfaces.h.
- Подключите их к проекту. Замените в файле MyCom.cpp директиву #include"interfaces.h" на tinclude "MyComTLib_i.с", а в файл MyCom.h вставьте новую директиву #include "MyComTLibJi.h".
- Измените содержимое файла MyCom.def так, чтобы оно учитывало создание новой DLL:
MyComTLib.def: Declares the module parameters. LIBRARY "MYCOMTLIB.dll" EXPORTS. DllGetclassObject PRIVATE DllCanUnloadNow PRIVATE