Регистрация обработчиков для .NET COM-события в C ++ - PullRequest
5 голосов
/ 22 января 2010

Я следовал «учебным пособиям» о том, как представить .NET Framework через 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.)

Ответы [ 2 ]

2 голосов
/ 24 января 2010

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

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

1 голос
/ 25 января 2010

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

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

Итак, зная, что класс реализует IDispatch, вам почти ничего не сказано.

Так что это ложное руководство, или вы пропустили объявление для таблиц отправки MessageEventHandler.

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

...