Распределенные приложения: контроллеры автоматизации. Часть 2. Фертиков В.В. - 31 стр.

UptoLike

Составители: 

31
template<class T>
class _ApplicationDispT : public TAutoDriver<_Application>
{
public:
. . .
HRESULT BindDefault()
{ return OLECHECK(Bind(CLSID_ExcelApplication));
}
HRESULT BindRunning()
{ return BindToActive(CLSID_ExcelApplication);
}
. . .
};
typedef _ApplicationDispT<_Application> _ApplicationDisp;
Мы видим здесь описание сразу пяти объектов: интерфейса
_Application, класса TCOM_Application, построенного по описанному
здесь же шаблону TCOM_ApplicationT, шаблон классов _ApplicationDispT
и построенный по нему класс _ApplicationDisp. В результате программист
получил в распоряжение два рабочих инструмента для программирования им -
портированного интерфейса: классы TCOM_Application и
_ApplicationDisp, инкапсулирующие соответственно интерфейс с виртуаль-
ной таблицей и диспинтерфейс. Это значит , что для программиста на C++ оба
рассмотренные выше способа доступа к дуальному интерфейсу столь же легко
реализуемы , как и для программиста на Object Pascal.
Из приведенного фрагмента видно, что _ApplicationDisp предусмат -
ривает удобные методы для установления соединения с уже работающим сер -
вером и для запуска сервера. Воспользуемся ими, чтобы переписать соответст-
вующий код нашего учебного генератора отчетов :
_ApplicationDisp Exl;
if(!SUCCEEDED( // если Excel работает -
Exl.BindRunning())) // подключиться к нему;
Exl.BindDefault(); // не запущен - запустить его
Просматривая заголовочный файл Excel_TLB.h, можно заметить также,
что многие свойства и методы возвращают типы , идентификаторы которых
имеют один и тот же суффикс Ptr. Так в приведенном выше фрагменте свойст-
во Workbooks интерфейса _Application имеет тип WorkbooksPtr. Описа-
ния всех этих типов тоже можно найти в файле Excel_TLB.h, например :
interface DECLSPEC_UUID(
"{000208DA-0000-0000-C000-000000000046}") _Workbook;
typedef TComInterface<_Workbook,&IID__Workbook> _WorkbookPtr;
interface DECLSPEC_UUID(
"{000208DB-0000-0000-C000-000000000046}") Workbooks;
typedef TComInterface<Workbooks,&IID_Workbooks> WorkbooksPtr;
                                    31
template
class _ApplicationDispT : public TAutoDriver<_Application>
{
public:
      . . .
   HRESULT BindDefault()
   { return OLECHECK(Bind(CLSID_ExcelApplication));
   }
   HRESULT BindRunning()
   { return BindToActive(CLSID_ExcelApplication);
   }
      . . .
};
typedef _ApplicationDispT<_Application> _ApplicationDisp;

     Мы    видим здесь описание сразу пяти объектов: интерфейса
_Application , класса TCOM_Application , построенного по описанному
здесь же шаблону TCOM_ApplicationT , шаблон классов _ApplicationDispT
и построенный по нему класс _ApplicationDisp . В результате программист
получил в распоряжение два рабочих инструмента для программирования им-
портированного       интерфейса:     классы       TCOM_Application        и
_ApplicationDisp , инкапсулирующие соответственно интерфейс с виртуаль-
ной таблицей и диспинтерфейс. Это значит, что для программиста на C++ оба
рассмотренные выше способа доступа к дуальному интерфейсу столь же легко
реализуемы, как и для программиста на Object Pascal.
      Из приведенного фрагмента видно, что _ApplicationDisp предусмат-
ривает удобные методы для установления соединения с уже работающим сер-
вером и для запуска сервера. Воспользуемся ими, чтобы переписать соответст-
вующий код нашего учебного генератора отчетов:
_ApplicationDisp Exl;
if(!SUCCEEDED(         // если Excel работает -
    Exl.BindRunning()))    // подключиться к нему;
  Exl.BindDefault();   // не запущен - запустить его

      Просматривая заголовочный файл Excel_TLB.h , можно заметить также,
что многие свойства и методы возвращают типы, идентификаторы которых
имеют один и тот же суффикс Ptr. Так в приведенном выше фрагменте свойст-
во Workbooks интерфейса _Application имеет тип WorkbooksPtr . Описа-
ния всех этих типов тоже можно найти в файле Excel_TLB.h, например:
interface DECLSPEC_UUID(
     "{000208DA-0000-0000-C000-000000000046}") _Workbook;
typedef TComInterface<_Workbook,&IID__Workbook> _WorkbookPtr;
interface DECLSPEC_UUID(
     "{000208DB-0000-0000-C000-000000000046}") Workbooks;
typedef TComInterface WorkbooksPtr;