Разработка клиента с использованием специальных указателей
Рассматриваемые новшества вы в изобилии увидите, если откроете файл MyCoTLib.tlh:
// Created by Microsoft (R) C/C++ Compiler. // // d:\my projects\saytlibclient\debug\MyComTLib.tlh // // C++ source equivalent of Win32 type library // D:\My Projects\MyComTLib\Debug\MyComTLib.tlb // compiler-generated file. – DO NOT EDIT! #pragma once #pragma pack (push, 8) #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;