Неуправляемое взаимодействие C ++ COM и Managed C ++ .NET4 - PullRequest
1 голос
/ 04 мая 2011

У меня есть служба ATL COM, к которой я могу подключиться через приложение Windows Forms .NET4, написанное по большей части для управляемого c ++.

Я могу успешно получить указатель на интерфейс (через CoCreateInstance()), но возникают проблемы при попытке реализовать приемник событий.Я хочу создать неуправляемый класс C ++ в приложении, которое реализует интерфейс, определенный COM-сервером, и получать события от ConnectionPoint.Что у меня так далеко:

  • Понимая, что это невозможно, используя управляемый класс (класс ref) c ++, я использую обычный неуправляемый класс.
  • в состоянии использовать любые макросы ATL, мне нужно реализовать абстрактные функции IUnknown (AddRef, Release, QueryInterface и т. д.) в классе приемников.

Я могу получить указатель IConnectionPoint для интерфейса, но вызовAdvise () возвращает E_NOTIMPL.Это заставляет меня поверить, что я где-то пропустил реализацию некоторых базовых функций ATL, но я не уверен, с чего начать.

Кроме того, я нашел очень мало ресурсов в сети об использовании COMв управляемом проекте C ++.Самое близкое, к чему я пришел - это эта статья.У кого-нибудь есть хорошее чтение на эту тему?Он покалечил мой мозг в данный момент.

1 Ответ

1 голос
/ 04 мая 2011

В вашем управляемом приложении C ++ добавьте ссылку на COM-сервер, используя опцию «Добавить ссылку», это создаст управляемую оболочку (сборку) для вашего COM-компонента, которую вы сможете использовать в своем «управляемом коде c ++».События в вашем COM-компоненте должны быть доступны как события .NET, которые можно обрабатывать с помощью обычной обработки событий в управляемом C ++.

Из вашего описания кажется, что вы пытаетесь использовать COM-компонент в управляемом приложении C ++, используя неуправляемый код, что усложняет задачу.Смешивание управляемого и неуправляемого кода должно иметь четкие границы, а чрезмерный переход внутрь и из этих границ усложнит ситуацию и приведет к другим серьезным проблемам.Поэтому я предлагаю вам использовать компонент COM только с использованием «управляемого кода» (c ++), создавая управляемую оболочку для компонента COM.

...