Модератор
5102 / 3329 / 535
Регистрация: 01.06.2013
Сообщений: 6,956
Записей в блоге: 9
1

ATL: Как вызывать события ConnectionPoint

03.07.2020, 00:58. Показов 20373. Ответов 1

Author24 — интернет-сервис помощи студентам
Желаю не болеть коронавирусом всем!

Создал ATL проект в VS, создал SimpleObject (рисовать COM-сервер ничего не должен, только предоставлять клиенту объекты и позволять навешивать свои обработчики событий), пометил галочкой пункт про поддержку ConnectionPoint. Создалось два интерфейса - для объекта и для событий которые, как я понимаю, он может вызывать на клиенте. Название второго интерфейса заканчивается на Events. Создались и два класса - для объекта и для событий. Как создавать методы вызываемые для объекта из клиента понятно. А как создавать код вызывающий события? Делая ПКМ на самом интерфейсе Events я могу добавить туда метод, но никакого кода в классе производном от IConnectionPointImpl не добавляется.
Порывшись в хламе я нашёл пример проекта в котором добавлен метод в интерфейс Events
Кликните здесь для просмотра всего текста
Код
	dispinterface _ICTestEventEvents
	{
		properties:
		methods:
		[id(1), helpstring("method OnSendNotification")] HRESULT OnSendNotification(BSTR method, BSTR args);
	};
, и в классе производном от IConnectionPointImpl есть реализация
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
template<class T>
class CProxy_ICTestEventEvents :
    public IConnectionPointImpl<T, &__uuidof(_ICTestEventEvents)>
{
public:
    HRESULT Fire_OnSendNotification(BSTR  method, BSTR  args)
    {
        HRESULT hr = S_OK;
        T * pThis = static_cast<T *>(this);
        int cConnections = m_vec.GetSize();
 
        for (int iConnection = 0; iConnection < cConnections; iConnection++)
        {
            pThis->Lock();
            CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection);
            pThis->Unlock();
 
            IDispatch * pConnection = static_cast<IDispatch *>(punkConnection.p);
 
            if (pConnection)
            {
                CComVariant avarParams[2];
                avarParams[1] = method; avarParams[1].vt = VT_BSTR;
                avarParams[0] = args;   avarParams[0].vt = VT_BSTR;
                CComVariant varResult;
 
                DISPPARAMS params = { avarParams, NULL, 2, 0 };
                hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, &varResult, NULL, NULL);
            }
        }
        return hr;
    }
};

Но каким визардом это делается? Или для каждого события нужно вручную такую функцию дописать?
(что она делает, понятно - вызвает Invoke для каждого клиента, но она заточена под конкретный список аргументов метода - два аргумента типа BSTR).

p.s. В общем то мне нужно, что бы при наступлении события на COM-сервере, он известил клиента создавшего объект. Если это делается вообще не через ConnectionPoint, то прошу объяснить. Я в COM-технологии далеко не гуру.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2020, 00:58
Ответы с готовыми решениями:

Как вызывать ajax функцию без события?
Добрый день. Подскажите, как можно вызывать ajax функцию без событий, то есть нажатия кнопок и тп....

Как вызывать события подгруженных компонентов из ajax?
Добрый день! Обрисую ситуацию. У меня есть страница index.html в ней javascript код и пустая...

Можно ли вызывать делегат без события в определенное время
Всем привет Можно ли вызывать делегат без события в определенное время? Таймером, что-ли? Если...

Писать несколько обработчиков для одного события или один обработчик, в котором вызывать методы?
Например есть событие Click. Для него автоматически создается обработчик button_Click (object...

1
Модератор
5102 / 3329 / 535
Регистрация: 01.06.2013
Сообщений: 6,956
Записей в блоге: 9
04.07.2020, 10:16  [ТС] 2
Лучший ответ Сообщение было отмечено politoto как решение

Решение

Сам нашёл как сделать.
https://www.codeproject.com/Ar... Approaches
http://www.369o.com/data/books... 1sec2.html
0
04.07.2020, 10:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2020, 10:16
Помогаю со студенческими работами здесь

ATL не ясно как добавить объект
Здорова! Создал проект ATL dll. В книге написано: &quot;После создания COM сервера можно добавлять в...

Как работать с ATL OLE DB Consumer wizard?
Здраствуйте! Я на форуме первый раз. Я пишу простенькую програму на MFC доступ к базе данных...

ATL Project. Как подключить использование MFC и ADO?
Добрый день! Переписываю dll, которую до меня писал другой программист. В Readme проекта в самом...

В ATL нашел код: __interface - как это работает
__interfase - структура не содержащая свойств! в ATL нашел такой вот код, и никак не пойму как это...

Как в одном обработчике события запустить другой обработчик события
Есть список listView1, который заполняется из массива PeopleListprivate void...

Как вызвать один обработчик события в другом обработчике события?
Здравствуйте. Подскажите пожалуйста, каким образом можно вызвать информацию из одного обработчика...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru