Почему «Добавить метод IDL» в интерфейсе добавляет метод в модуль, а также в CoClass?

Этот вопрос касается использования Visual Studio 2019 для создания внепроцессного COM-сервера с использованием ATL. (Я делал это раньше в Borland, но это мой первый раз, когда я использую MSVC).

Я создал проект с помощью мастера проектов ATL. Это создало модуль class CMyObjectsProjectModule : public ATL::CAtlExeModuleT<CMyObjectsProjectModule>в файле .

Затем я добавил простой объект через «Добавить > Простой объект ATL», как описано в документации . Это создало файлы, содержащие интерфейс и CoClass . Все идет нормально.

я иду в IMyObjectв представлении классов и щелкните правой кнопкой мыши «Добавить > Метод» и укажите некоторые подробности, затем он добавит объявление метода в CMyObjectв MyObject.hи пустое определение MyObject.cppв качестве . Пока все хорошо (опять же).

Однако в то же время он добавил объявление и определение метода в MyObjectsProject.cppкак член класса. Более того:

  • The CMyObjectsProjectModule::method_name()версия никогда не вызывается -- когда я использую COM-сервер через клиент и вызываю IMyObject::method_name()на экземпляре MyObject, он выполняет версию, определенную как CMyObject::method_name()как и ожидалось.
  • Я могу удалить объявление и определение метода из CMyObjectsProjectModuleи ошибок нет.

То же самое происходит при добавлении свойства. Кроме того, "Завершение операции..." занимает около 45-50 секунд.


Мой вопрос: по какой причине метод добавляется в модуль, а также в CoClass , и когда будет вызываться эта версия метода? (Или это просто баг и его вообще не предполагается добавлять в модуль?)

В Borland IDE аналогичная функция не добавляла методы в модуль.


РЕДАКТИРОВАТЬ: Первоначально разместил вопрос с проектом под названием MyProject, однако проблема возникает только при вызове проекта MyObjectsProject. Первоначально я использовал в вопросе разные имена из того, с чем я наблюдал проблему, но теперь отредактировал вопрос и воспроизвел его, используя точные имена в вопросе.

1 ответ

Метод не предполагается добавлять в модуль, и добавление метода не должно занимать 45-50 секунд.

Проблема возникает всякий раз, когда имя CoClass является начальной подстрокой имени модуля.

Например, это происходит с модулем , но не происходит с модулем из CMyProjectModule.

При возникновении проблемы представление класса для CMyObject > Derived Types >показывает производные типы CMyObjectа также CMyObjectsProjectModule.

Я предполагаю, что это «вывод» отношения производного типа между двумя типами, где один является начальной подстрокой другого; и, кроме того, поведение «Добавить метод» решает добавить метод ко всему, что, по его мнению, является производным типом CoClass, к которому добавлен метод.


Вывод: похоже, это ошибка (или, по крайней мере, сомнительный дизайн) в среде IDE; и чтобы обойти это, вы можете переименовать модуль, чтобы он начинался с некоторой уникальной подстроки, так что ни один из CoClasses не будет совпадать с начальными подстроками модуля.

Инструмент Class Designer не показывает два типа как производные (т. е. этот инструмент не использует ту же эвристику, что и окно Class View, для определения того, является ли один тип производным от другого)

Другие вопросы по тегам