Модератор
 Аватар для Curry
5152 / 3440 / 536
Регистрация: 01.06.2013
Сообщений: 7,502
Записей в блоге: 9

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

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

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

Создал ATL проект в VS, создал SimpleObject (рисовать COM-сервер ничего не должен, только предоставлять клиенту объекты и позволять навешивать свои обработчики событий), пометил галочкой пункт про поддержку ConnectionPoint. Создалось два интерфейса - для объекта и для событий которые, как я понимаю, он может вызывать на клиенте. Название второго интерфейса заканчивается на Events. Создались и два класса - для объекта и для событий. Как создавать методы вызываемые для объекта из клиента понятно. А как создавать код вызывающий события? Делая ПКМ на самом интерфейсе Events я могу добавить туда метод, но никакого кода в классе производном от IConnectionPointImpl не добавляется.
Порывшись в хламе я нашёл пример проекта в котором добавлен метод в интерфейс Events
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
    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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2020, 00:58
Ответы с готовыми решениями:

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

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

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

1
Модератор
 Аватар для Curry
5152 / 3440 / 536
Регистрация: 01.06.2013
Сообщений: 7,502
Записей в блоге: 9
04.07.2020, 10:16  [ТС]
Лучший ответ Сообщение было отмечено politoto как решение

Решение

Сам нашёл как сделать.
https://www.codeproject.com/Ar... Approaches
http://www.369o.com/data/books... 1sec2.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.07.2020, 10:16
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru