Мы создаем 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'.
В общем, я действительно не знаю
- почему в первую очередь изменилось поведение (с VS2013 на VS2015)?
- почему мои изменения заставили вещи снова начать работать (у меня есть свои теории)?
- что такоерекомендуемая методология в будущем?
a.Синтаксис IDL позволяет определять свойства без необходимости указания propput и propget.Один синтаксис рекомендуется по сравнению с другим?
b.я должен изменить все наши макросы, чтобы использовать макрос с суффиксом _ID?
Любое понимание приветствуется.
Спасибо.