Регистрация обработчиков для события COM.NET в C++

Я следовал 'учебным руководствам' того, как выставить платформу.NET через COM (http://msdn.microsoft.com/en-us/library/zsfww439.aspx и http://msdn.microsoft.com/en-us/library/bd9cdfyx.aspx). Все работает за исключением части событий. Когда я добавляю события к интерфейсу C#, следующий код C++ сгенерирован:

struct __declspec(uuid("..."))
_MessageEventHandler : IDispatch
{};

struct __declspec(uuid("..."))
IConnection : IDispatch
{
  virtual HRESULT __stdcall add_MessageEvent (
    /*[in]*/ struct _MessageEventHandler * value ) = 0;
  virtual HRESULT __stdcall remove_MessageEvent (
    /*[in]*/ struct _MessageEventHandler * value ) = 0;
}

Проблема состоит в том, что я не нашел информации о том, как использовать это в C++. Сделайте я должен произойти из _MessageEventHandler и реализация operator()? Или что-то еще полностью?

(Обратите внимание, что в настоящий момент я также пробую более зарегистрированный подход использования IConnectionPointContainer и IConnectionPoint.)

5
задан Randy Voet 22 January 2010 в 08:26
поделиться

2 ответа

Это было долгое время, так как я использовал COM и в то время я использовал Visual C ++ 6.0. Я помню, что внедрение тонусов для точек подключения COM не было простым процессом. Были несколько способов реализации их, в зависимости от того, используете ли вы MFC или ATL. Может быть, есть простые пути сейчас. Вот несколько ссылок, которые могут помочь вам:

Проект кода - тонущие события из управляемого кода в Unmaned C ++
Code Project - COM - Большое количество статей о COM
Code Project. В приложении консоли
Code Project - обработка COM события в консоли, часть II

2
ответ дан 15 December 2019 в 06:26
поделиться

Idispatch используется для связывания связывания времени выполнения, такие как VB, вы обычно не должны делать это для сильно напечатанного языка, такого как C #.

Когда вы вызываете метод через IDispatch, то, что вы на самом деле делаете, это создать массив, содержащий идентификатор метода (называемый Dispid) и параметры, затем обратите внимание на функцию, которая ищет через таблицу методов Dispid, когда она находит Один из них использует ваш массив параметра для создания CALLSTACK, а затем вызвать метод. (Конечно, это упрощение).

Итак, зная, что класс Idescatch сообщает вам почти ничего.

Так что это эфир ложный провод, или вы пропустите декларацию для рассылки для рассылки MessageeventHandler.

Это совсем не удивительно, что вы не можете понять, как реализовать из этого, вам не хватает жизненно важной информации.

1
ответ дан 15 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: