5. Перехват событий Excel

Перехватывая события Excel, Вы получаете возможность отслеживать его состояние и контролировать некоторые действия. Например, Вы можете отследить закрытие рабочей книги и корректно отключиться от Excel, произведя очистку памяти и прочие завершающие процедуры. Для того, чтобы понять, как перехватывать события, проведем небольшой экскурс в события COM объектов. В этом отступлении я предполагаю, что читатель немного знаком с COM архитектурой, хотя это не обязательно, в конце статьи я приведу уже готовое решение, которое можно использовать в своих приложениях, даже не задумываясь о тонкостях COM.

Если объект (будь-то СОМ или RCW объекта .NET) хочет получать события другого COM объекта, то он должен уведомить об этом источник событий, зарегистрировав себя в списке объектов-получателей уведомлений о событиях. Для этого СОМ предоставляет интерфейс IConnectionPointContainer, содержащий метод FindConnectionPoint. С помощью вызова метода FindConnectionPoint, объект-получатель события получает "точку подключения" - интерфейс IConnectionPoint и регистрирует c помощью метода Advise свою реализацию интерфейса IDispatch, методы которого будут реализовываться при возникновении тех или иных событий. Excel определяет интерфейс, который должен реализовываться классом-приемником событий.

interface

["00024413-0000-0000-C000-000000000046"]

{

DispId(0x61d)]

void NewWorkbook(object Wb);

DispId(0x616)]

void SheetSelectionChange(object Sh, object Target);

DispId(0x617)]

void SheetBeforeDoubleClick(object Sh, object Target, ref bool Cancel);

DispId(1560)]

void SheetBeforeRightClick(object Sh, object Target, ref bool Cancel);

DispId(0x619)]

void SheetActivate(object Sh);

DispId(0x61a)]

void SheetDeactivate(object Sh);

DispId(0x61b)]

void SheetCalculate(object Sh);

DispId(0x61c)]

void SheetChange(object Sh, object Target);

DispId(0x61f)]

void WorkbookOpen(object Wb);

DispId(0x620)]

void WorkbookActivate(object Wb);

DispId(0x621)]

void WorkbookDeactivate(object Wb);

DispId(1570)]

void WorkbookBeforeClose(object Wb, ref bool Cancel);

DispId(0x623)]

void WorkbookBeforeSave(object Wb, bool SaveAsUI, ref bool Cancel);

DispId(0x624)]

void WorkbookBeforePrint(object Wb, ref bool Cancel);

DispId(0x625)]

void WorkbookNewSheet(object Wb, object Sh);

DispId(0x626)]

void WorkbookAddinInstall(object Wb);

DispId(0x627)]

void WorkbookAddinUninstall(object Wb);

DispId(0x612)]

void WindowResize(object Wb, object Wn);

DispId(0x614)]

void WindowActivate(object Wb, object Wn);

DispId(0x615)]

void WindowDeactivate(object Wb, object Wn);

DispId(0x73e)]

void SheetFollowHyperlink(object Sh, object Target);

DispId(0x86d)]

void SheetPivotTableUpdate(object Sh, object Target);

DispId(2160)]

void WorkbookPivotTableCloseConnection(object Wb, object Target);

DispId(0x871)]

void WorkbookPivotTableOpenConnection(object Wb, object Target); }

Таким образом наш класс - приемник событий должен реализовывать этот интерфейс и регистрировать себя используя IConnectionPointContainer и IConnectionPoint. Библиотека базовых классов .NET уже определяет managed-версии интерфейсов: для IConnectionPointContainer это UCOMIConnectionPointContainer, а для IConnectionPoint - UCOMIConnectionPoint, которые определены в пространстве имен - System.Runtime.InteropServices.

Регистрация класса-приемника событий будет выглядеть так:

// Объявляем ссылки на IConnectionPointContainer UCOMIConnectionPointContainer icpc;

// и на IConnectionPoint

UCOMIConnectionPoint icp;

// Получаем ссылку на Excel

FExcel = Marshal.GetActiveObject("Excel.Application");

// Получаем ссылку на интерфейс IConnectionPointContainer

icpc = FExcel as UCOMIConnectionPointContainer;

// Получаем «точку подключения»

Guid guid = new Guid("00024413-0000-0000-C000-000000000046");

icpc.FindConnectionPoint(ref guid, out icp);

// Регистрируем класс - приемник событий, который реализует

// интерфейс с GUID ["00024413-0000-0000-C000-000000000046"]

// При этом наш класс получает уникальный идентификатор

// cookie, который нужно сохранить, чтобы иметь

// возможность отключиться от источника событий

icp.Advise(ExcelEventSink, out cookie);

Для отключения от событий достаточно вызвать метод Unadvise(), и передать ему в качестве параметра идентификатор cookie, который мы получили при регистрации нашего класса-приемника событий методом Advise:

icp.Unadvise(cookie);

6. Заключение.

Мы рассмотрели в статье на примере с MS Excel взаимодействие COM и NET, используя позднее связывание. Используя аналогичный подход, можно организовать управление любым COM сервером. (Чаще всего автоматизируют приложения пакета MS Office и MS Internet Explorer).

В приложенном к данной статье файле находится класс, с помощью которого можно организовать обработку событий Excel в любом приложении .NET.

7. Литература

Эндрю Троелсен. С# и платформа .NET. Библиотека программиста. - СПб. Питер, 2004.

Н. Елманова, С. Трепалин, А. Тенцер. Delphi 6 и технология СОМ. - СПб. Питер, 2002.

Техническая документация M


Информация о работе «Работа с бинарными данными и реестром Windows на платформе .NET»
Раздел: Информатика, программирование
Количество знаков с пробелами: 67200
Количество таблиц: 0
Количество изображений: 2

Похожие работы

Скачать
253716
5
10

... хранимых процедур на других серверах. RPC представляет собой достаточно удобный способ работы с распределенными данными без необходимости внесения изменений в клиентскую часть приложения. MS Distributed Transaction Coordinator (DTC). Создание распределенных приложений приводит к тому, что транзакции также приобретают распределенный характер. Структуризация приложения в виде многих самостоятельных ...

Скачать
87374
8
17

... предприятия. Для дальнейшего развития Системы необходимо рассчитать экономическую эффективность проекта. Для этого необходимо выбрать направление распространения Системы. Заказчиком системы выступало закрытое акционерное общество "Белгородский бройлер". Произведем расчет экономической эффективности проекта с точки зрения заказного проекта. Структура экономической части при создании программного ...

Скачать
293733
5
0

... метод доступа с передачей полномочия. Охарактеризовать метод множественного доступа с разделением частоты. Какие существуют варианты использования множественного доступа с разделением во времени? Лекция 5.ЛВС и компоненты ЛВС Компьютерная сеть состоит из трех основных аппаратных компонент и двух программных, которые должны работать согласованно. Для корректной работы устройств в сети их нужно ...

Скачать
111671
2
24

... организации некоторые пользователи могут быть ограничены в правах.   Безопасность сервера IIS Интернет-сервер (Internet Information Server, US) обеспечивает доступ по сети к файловым и вычислительным ресурсам компьютера с операционной системой Windows NT по протоколам HTTP, FTP, Gopher. При подключении к Интернету информационные ресурсы становятся доступны огромному неконтролируемому ...

0 комментариев


Наверх