Не удалось получить рабочие точки подключения ATL

Я пытаюсь создать COM-компонент с помощью ATL, и я хотел бы увеличить события для моего клиента VB. Я нашел множество обучающих программ, все из которых, похоже, различаются по деталям, и ни один из них не создает рабочего решения. Вот что я делаю:

(С использованием Visual Studio 2008):

  1. Создайте новый проект ATL DLL. Я позвонил ATLEventTest.
  2. Вид класса: Щелкните правой кнопкой мыши ATLEventTest, добавлен новый класс ATL Simple Object. Я назвал это MyObject, которое сгенерировалось CMyObject, IMyObjectи т. Д. ...
  3. Этот объект был создан с помощью: a) Thread Threading b) Агрегация c) Двойной интерфейс d) ISupportErrorInfo e) Точки подключения

  4. Щелкните правой кнопкой мыши CProxy_IMyObjectEvents<T>, нажмите «Добавить функцию»,

  5. Функция имеет тип void return, named someEventи принимает значение int testParam.
  6. Перестроить.
    (В этот момент я должен увидеть где-то «Реализуем точку подключения», я не ...)
  7. Щелкните правой кнопкой мыши CMyObject. 'Добавить точку подключения'
  8. Перемещено _IMyObjectEventsв список.
  9. Был ли поиск кода в моем решении. Невозможно найти someEventнигде!
  10. someEventСнова добавлена функция. Теперь он найден в ATLEventTest_i.h
  11. Должна иметь возможность вызвать fire_someEvent(...)мой код, но не могу.

Это сводило меня с ума, пытаясь заставить это работать. Если кто-то может понять, что я делаю неправильно, я буду признателен за любые исправления, советы, хаки и т. Д.

На данный момент у меня возникает соблазн сказать «винт мастеров» и просто попытаться напрямую изменить c ++ и idl, но у меня есть ощущение, что это может быть не очень хорошо :(

c++,events,com,atl,connection-points,

3

Ответов: 6


Попробуйте использовать метод, описанный в этом месте:

Добавление события (ATL) @ MSDN

С именами примеров, которые вы указали выше, в вашем файле MyObject.idl вы должны увидеть декларацию для вашего исходящего даже в разделе для dispinterface _IMyObjectEvents. Поскольку вы щелкнули правой кнопкой мыши на CProxy_IMyObjectEvents <T>, а не на _IMyObjectEvents в библиотеке, ваш IDL, вероятно, не имеет определения. Файл сгенерированный автоматически файл _IMyObjectEvents_CP.h должен присутствовать в файлах заголовков проекта и должен содержать метод Fire_someEvent () в результате правильного добавления метода. Если нет, вы можете обнаружить, что он просто создал метод с именем someEvent ().

Вот схема, которую вы можете попробовать в тестовом проекте.

  1. Создайте новый проект ATL DLL. Я назвал его ATLEventTest1.
  2. Построить проект.
  3. Вид класса: щелкните правой кнопкой мыши на ATLEventTest1, добавьте новый класс ATL Simple Object. Назовите это MyObject.
  4. Создайте определение с помощью а) Thread Threading b) Двойной интерфейс c) Точки подключения и все, что вам нужно.
  5. Перестроить проект.
  6. Вид класса: найдите библиотеку ATLEventTest1Lib, щелкните правой кнопкой мыши на _MyObjectEvents и «Добавить метод».
  7. Метод имеет тип void return, называемый someEvent, и принимает int testParam с атрибутом параметра [in].
  8. Вы должны увидеть «[in] int testParam» в результате добавления параметра.
  9. На вкладке «Атрибуты IDL» измените идентификатор, если это необходимо. Нажмите «Готово».
  10. Вид класса: щелкните правой кнопкой мыши на CMyObject, перейдите в «Добавить ...», перейдите к «Реализация точки подключения».
  11. Выберите _IMyObjectEvents и нажмите «>», чтобы переместить его в список реализованных точек подключения. Нажмите «Готово».
  12. Перестроить.
  13. Теперь, в вашем классе CMyObject, вы должны иметь возможность вызвать Fire_someEvent (). Вы увидите новый метод в вашем файле ATLEventTest1.idl под разделителем _IMyObjectEvents; файл заголовка _IMyObjectEvents_CP.h будет создан и создаст широковещательный код для Fire_someEvent ().

1

У вас классная реализация IProvideClassInfo / IProvideClassInfo2? Если я помню для неконтролируемых объектов, VB требует, чтобы это определяло интерфейс источника события.

Попробуй это:

public IProvideClassInfo2Impl<&CLSID_MyClass NULL, &LIBID_ATLEventTest, 1, 0>,

а затем в интерфейсной карте

COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)

0

Возможно, у вас есть проблема с нарезкой квартиры. Вы пишете консольное приложение на VB? Для этого требуется, чтобы классический насос сообщений работал правильно (например, приложение для классических окон). Попробуйте использовать другой режим квартиры на COM-объекте (MTA).


0

ОК. Поэтому после новой перестройки системы я установил как Visual Studio 2005, так и Visual Studio 2008. Я могу прекрасно работать в 2005 году. По-прежнему не может получить то, что работает в 2008 году. Похоже, мне просто придется работать на VS2005 для моего материала ATL ...

Еще раз спасибо всем, кто помог.


0

У меня была такая же проблема. Читал документы MSDN и искал в Интернете. Наконец, я понял это.

Главное, что мастер не делает, это поместить объявление в файл IDL. Я вручную добавил его, и в моем классе theres «Fire_».

Надеюсь, это поможет вам.

C ++, события, COM, ATL, соединительные точки,