Что-то изменилось в компиляции макросов IDL или MFC в Visual Studio 2015 в связи с получающимися интерфейсами COM и регистрацией? - PullRequest
2 голосов
/ 24 мая 2019

Мы создаем OCX, который содержит элемент управления Map и множество вспомогательных классов (например, GeoProjection, Extents), которые могут выступать в качестве автономных классов и многие из которых также являются свойствами карты.

Одно из наших старых приложенийон использует OCX, встроенный в Visual Basic 6. После обновления сборки с VS2013 до VS2015 мы заметили различия в том, как мы должны получить доступ к некоторым свойствам из VB6.В частности, у нас были две проблемы: свойства Map.GeoProjection и Map.Extents.Они оба начали выдавать ошибки «Библиотека не зарегистрирована» при попытке их использовать.

В случае с GeoProjection я смог решить проблему, просто добавив команду VB «Set» в назначение, какследует:

Dim gp As New GeoProjection
gp.ImportFromEPSG m_MapProjection ' contains the EPSG code
Set Map.GeoProjection = gp.Clone

Почему «Набор» не требовался до этого, я не знаю.Похоже, что так должно было быть, поскольку он устанавливает ссылку на объект.

Несмотря на это, когда я попытался сделать то же самое со свойством Extents, это не решило проблему, а вместо этого привело к «Автоматизации».Ошибка".Поэтому в следующий раз я рассмотрел определения макросов IDL и MFC, чтобы увидеть, как определения различаются и почему поведение может отличаться.

GeoProjection IDL

[id(192)] IGeoProjection* GeoProjection;

завершает экстенты IDL

[id(17), propput, nonbrowsable] void Extents(IExtents* nNewValue);
[id(17), propget, nonbrowsable] IExtents* Extents();

Макрос отправки GeoProjection

DISP_PROPERTY_EX_ID(CMapView, "Projection", dispidProjection, GetGeoProjection, SetGeoProjection, VT_DISPATCH)

и макрос отправки Extents

DISP_PROPERTY_EX(CMapView, "Extents", GetExtents, SetExtents, VT_DISPATCH)

Что особенно поразило меня, так это разница в использовании DISP_PROPERTY_EX по сравнению с DISP_PROPERTY_EX_ID.По иронии судьбы я не могу найти документацию Microsoft по DISP_PROPERTY_EX_ID.Единственное руководство, которое я смог найти, это комментарии в файле afxdisp.h, где он описывает две группы макросов следующим образом:

в строке 288, перед макросами без суффикса _ID

// these DISP_ macros cause the framework to generate the DISPID

и в строке 313 до макроса с суффиксом _ID

// these DISP_ macros allow the app to determine the DISPID

Поскольку у нас есть файл .h, который определяет идентификаторы отправки для каждой функции, кажется, что мы всегда должны использовать эти идентификаторы в пределахМакросы, следующим образом.Это гарантирует, что идентификаторы отправки всегда будут одинаковыми (что, я думаю, будет иметь значение при использовании COM-вызовов с ранним связыванием).

DISP_PROPERTY_EX_ID(CMapView, "Extents", dispidExtents, GetExtents, SetExtents, VT_DISPATCH)

Как только я внес изменения в свойство Extents в IDL

[id(17)] IExtents* Extents;

и при использовании макроса DISP_PROPERTY_EX_ID мы смогли успешно установить свойство Extents из VB6, используя инструкцию 'Set'.

В общем, я действительно не знаю

  1. почему в первую очередь изменилось поведение (с VS2013 на VS2015)?
  2. почему мои изменения заставили вещи снова начать работать (у меня есть свои теории)?
  3. что такоерекомендуемая методология в будущем?
    a.Синтаксис IDL позволяет определять свойства без необходимости указания propput и propget.Один синтаксис рекомендуется по сравнению с другим?
    b.я должен изменить все наши макросы, чтобы использовать макрос с суффиксом _ID?

Любое понимание приветствуется.

Спасибо.

...