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

Ответов: 6


5 ов

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

Добавление события (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, соединительные точки,
Похожие вопросы
Яндекс.Метрика