Новый
проект
Для ознакомления
с возможностями 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("My
Test DLL COM-server ISay")
]
interface
ISay : lUnknown
{
HRESULT
Say();
HRESULT
SetWord([in]BSTR word);
}
//======
Описание библиотеки типов
[
uuid(0934DA90-608D-4107-9ECC-C7E828AD0928),
version(1.0),
helpstring("My
Test 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.
Для того чтобы
двинуться дальше, вам необходимо взять некоторые файлы из папки МуСот с предыдущим
проектом типа 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