Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-1142189617
guitarist
2006-03-12 21:53
2006.06.04
PrintScreen и его перехват


15-1147076414
Иксик
2006-05-08 12:20
2006.06.04
Кто тут из Тернополя? Признавайтесь!


4-1141718189
Handle
2006-03-07 10:56
2006.06.04
Иконка в ListView


2-1147787175
!_SM_!
2006-05-16 17:46
2006.06.04
Массив компанент


2-1147684032
Tempora
2006-05-15 13:07
2006.06.04
При обработке данных приложение как-бы замерзает





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский