Форум: "Corba";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
ВнизПодключение к событиям ole-серверов на delphi Найти похожие ветки
← →
Juice © (2005-07-01 10:13) [0]Везде при освещении работы с серверами автоматизации показывается только как устанавливать их свойства и выполнять функции, но как же быть с событиями ? Как установить на Delphi обработчик события ole-сервера ?
← →
just_me (2005-07-01 14:13) [1]Можно здесь почитать:
http://www.techvanguards.com/com/concepts/events.asp
← →
Juice © (2005-07-01 14:22) [2]Задача моя простая до невозможности, синхронизировать аутлук с почтовым сервером.
Вот кусок кода, на котором я наткнулся на эту проблему (правда сишный, но простой, разницы особой нет):
void __fastcall myfunc(void)
{
}
...
oApp = CreateOleObject("outlook.application");
oNs = oApp.OleFunction("GetNameSpace", "MAPI");
oNs.OlePropertyGet("SyncObjects").OleFunction("Item",1).OlePropertySet ("SyncEnd", myfunc);
Таким образом я хотел сделать myfunc обработчиком события SyncEnd :) Оно конечно не прокатило, все оказалось гораздо сложнее.
Нашел такую статью:
Теперь следует рассмотреть последовательность вызовов методов, необходимых для поддержки нотификаций COM.
1) При разработке клиентского приложения в нем необходимо реализовать диспинтерфейс, то есть создать класс с реализацией его методов. Идентификатор GUID и список методов этого диспинтерфейса берутся из библиотеки типов сервера. Для разработанного ранее примера (см. рис. 3.4) это интерфейс ITestDisp. В Delphi 4 для этого приходилось писать код вручную. В более поздних версиях Delphi появилась возможность автоматически создавать интерфейс в клиентском приложении путем установки флажка Generate Component Wrapper (см. рис. 3.9).
Вот тут у меня возникает полная каша в голове :( Помогите пожалуйста разобраться, я новичек в ОЛЕ, а тема эта насколько я слышал считается одной из самых сложных в win-программировании. Generate Component Wrapper насколько я понимаю мне не поможет, ведь обложка уже и так существует на странице Servers, но в том компоненте нет необходимого мне события, там их всего пару штук.
Тперь конкретные вопросы: на основании чего создать этот класс с диспинтерфейсом? Написано что идентификатор и методы надо взять из библиотеки типов. Через меню Project/Import Type Library я нашел библиотеку типов соотв. аутлуку, открыл ее, нашел диспинтерфейс SyncObjectEvents:
Name: SyncObjectEvents
GUID: {00063085-0000-0000-C000-000000000046}
Методы:
[
id(0x0000F001),
helpcontext(0x005266EC)
]
void SyncStart( void );
---------------------------
[
id(0x0000F002),
helpcontext(0x005266ED)
]
void Progress([in] OlSyncState State /*Warning: unable to validate structure name: */, [in] BSTR Description, [in] long Value, [in] long Max );
------------------------------
[
id(0x0000F003),
helpcontext(0x005266EE)
]
void OnError([in] long Code, [in] BSTR Description );
--------------------------------------------------------
[
id(0x0000F004),
helpcontext(0x005266EF)
]
void SyncEnd( void );
Каким образом теперь использовать эту информацию для создания своего класса соотв. этому интерфейсу ? Следует ли включать в него методы которые мне не нужны (все кроме SyncEnd) ?
Теперь продолжение статьи:
2) При обращении клиента к COM-серверу и получении ссылки на фабрику классов клиент обращается к серверу за интерфейсом IConnectionPointContainer.
3) После получения ссылки на интерфейс IConnectionPointContainer клиент вызывает его метод FindConnectionPoint. В качестве параметра этого метода используется GUID реализованного на клиенте диспинтерфейса, в нашем примере — ITestDisp.
4)Метод IConnectionPointContaner.FindConnectionPoint реализуется на сервере таким образом, что он просматривает GUID всех нотификационных диспинтерфейсов, определенных на сервере (а их может быть несколько). Если запрашиваемый идентификатор GUID будет найден, то клиенту передается ссылка на интерфейс IConnectionPoint, который уже работает с конкретным нотификационным диспинтерфейсом.
5) При получении ссылки на интерфейс IConnectionPoint клиент вызывает его метод Advise. В качестве параметра этого метода используется ссылка на экземпляр интерфейса, реализованного на клиенте.
6) Сервер при вызове метода IConnectionPoint.Advise вызывает EventSinkChanged. В этом методе запоминается ссылка на клиентский интерфейс в переменной FEvents. Возвращаемый параметр метода IConnectionPoint.Advise — идентификатор.
7) Клиент получает и запоминает идентификатор с сервера. Теперь клиент готов принимать нотификации.
8) Когда клиенту более не нужны нотификации (например, перед завершением работы), клиент вновь получает ссылку на интерфейс IConnectionPoint, как это было описано в п. п. 2–4, и вызывает уже другой метод IConnectionPoint.UnAdvise. В качестве параметра этого метода используется идентификатор, полученный в п. 7.
9) Сервер вновь вызывает метод EventSinkChanged с параметром nil, который запоминается в переменной FEvents. C этого момента нотификации клиенту не передаются.
Ну, тут пока вроде все более-меннее ясно. Статья находится по адресу : http://www.megalib.com/books/821/chapt.htm.
Подскажите пожалуйста как реализовать этот интерфейс ?
← →
Juice © (2005-07-01 19:48) [3]Тема закрыта
Страницы: 1 вся ветка
Форум: "Corba";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.084 c