Невозможно заставить работать точки подключения ATL - PullRequest
3 голосов
/ 14 июня 2009

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

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

  1. Создайте новый проект библиотеки ATL. Я назвал это ATLEventTest.
  2. Представление класса: щелкнув правой кнопкой мыши на ATLEventTest, добавлен новый класс простых объектов ATL. Я назвал это MyObject, которое сгенерировало CMyObject, IMyObject и т. Д ...
  3. Этот объект был создан с: а) Резьба в квартире б) агрегация в) двойной интерфейс d) ISupportErrorInfo д) Точки подключения

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 15 июня 2009

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

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

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

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

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

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

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

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

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

COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
0 голосов
/ 27 июня 2014

Мне удалось устранить подобную проблему, удалив все _I *** ссылки на события из файла .h элемента управления

0 голосов
/ 23 июля 2009

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

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

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

0 голосов
/ 01 июля 2009

Хорошо. Поэтому после перестройки новой системы я установил и Visual Studio 2005, и Visual Studio 2008. В 2005 году я смог добиться успеха. До сих пор не могу заставить эту работу работать в 2008 году. Похоже, мне просто придется поработать над VS2005 для моего ATL-материала ...

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

0 голосов
/ 16 июня 2009

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

...