Почему «Добавить метод 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, для определения того, является ли один тип производным от другого)