Учебник по Visual C++ .Net


Разработка клиента с использованием - часть 3


#include<comdef.h>

//

// Forward references and typedefs //

struct __declspec(uuid("0934da90-608d-4107

-9eccc7e828ad0928"))

/* LIBID */ _MyCom; struct /* coclass */ CoSay;

struct _declspec(uuid("170368dO-85be

-43af-ae71053f506657a2"))

/* interface */ ISay;

{

//

// Smart pointer typedef declarations //

_COM_SMARTPTR_TYPEDEF(ISay, _uuidof(ISay));

//

// Type library items

//

struct _declspec(uuid("9b865820-2ffa

-lld5-98b4-00e0293f01b2"))

CoSay;

// [ default ] interface ISay

struct _declspec(uuid("170368dO-85be

-43af-ae71-053f506657a2")) ISay : lUnknown

{

//

// Wrapper methods for error-handling

//

HRESULT Say ( ) ;

HRESULT SetWord (_bstr_t word ) ;

//

// Raw methods provided by interface -

//

virtual HRESULT _stdcall raw_Say ( ) = 0;

virtual HRESULT _stdcall raw_SetWord

( /*[in]*/ BSTR word ) = 0;

};

//

// Named GUID constants initializations

//

extern "C" const GUID _declspec(selectany)

LIBID_MyCom =

{Ox0934da90, Ox608d, 0x4107,

{.Ox9e, Oxcc, Oxc7, Oxe8, 0x28, Oxad, 0x09, 0x28} } ;

extern "C" const GUID __declspec(selectany) CLSID_CoSay =

{Ox9b865820,0x2ffa,OxlId5,

{0x98,Oxb4,0x00,OxeO,0x29,Ox3f,0x01,Oxb2}};

extern "C" const GUID __declspec(selectany) IID_ISay =

{

0xl70368dO,Ox85be,0x43af,

{0xae,0x71,0x05,Ox3f,0x50,Охбб, 0x57,Oxa2}

};

//

// Wrapper method implementations //

#include "c:\myprojects\saytlibclient

\debug\MyComTLib.tli"

#pragma pack(pop)

Код TLH-файла имеет шаблонную структуру. Для нас наибольший интерес представляет код, который следует после упреждающих объявлений регистрируемых объектов. Это объявление специального (smart) указателя:

_COM_SMARTPTR_TYPEDEF(ISay, _uuidof(ISay));

Для того чтобы добавить секретности, здесь опять использован макрос, который при расширении превратится в:

typedef _com_ptr_t<_com_IIID<ISay, _uuidof(ISay)> > ISayPtr;

Как вы, вероятно, догадались, лексемы _com_lliD и com_ptr_t представляют собой шаблоны классов, первый из них создает новый класс C++, который инкапсулирует функциональность зарегистрированного интерфейса ISay, а второй — класс указателя на этот класс. Операция typedef удостоверяет появление нового типа данных ISayPtr. Отныне объекты типа ISayPtr являются указателями на класс, скроенный по сложному шаблону. Цель — избавить пользователя от необходимости следить за счетчиком ссылок на интерфейс isay, то есть вызывать методы AddRef и Release, и устранить необходимость вызова функции CoCreatelnstance. Заботы о выполнении всех этих операций берет на себя новый класс. Он таким образом скрывает от пользователя рутинную часть работы с объектом СОМ, оставляя лишь творческую. В этом и заключается смысл качественной характеристики smart pointer («сообразительный» указатель).




Начало  Назад  Вперед



Книжный магазин