Преобразование кода раннего связывания в код позднего связывания

Я часто писал код раннего связывания на VBA и VB6 для автоматизации офисных приложений (Word, Excel и т. д.), а затем переключал его на позднее связывание для обработки нескольких версий этих приложений. Я пытаюсь сделать то же самое, но я автоматизирую ГИС-приложение ESRI ArcMap, и концепции, которые я использовал в прошлом, похоже, не переводятся.


Следующий код работает правильно:

Sub EarlyBinding()
Dim ArcMap As esriArcMapUI.MxDocument

    Set ArcMap = GetObject("C:\Users\Mike\Downloads\Assessment Mapping.mxd", _
                           "esriArcMapUI.MxDocument")
    Debug.Print ArcMap.Title
End Sub

Но этот код завершается с ошибкой Объект не поддерживает это свойство или метод в строке Debug.Print:

Sub LateBinding()
Dim ArcMap As Object

    Set ArcMap = GetObject("C:\Users\Mike\Downloads\Assessment Mapping.mxd", _
                           "esriArcMapUI.MxDocument")
    Debug.Print ArcMap.Title

End Sub

Есть ли что-то особенное в приложениях MS Office, что они поддерживают этот подход лучше, чем COM-серверы в целом? Или что-то особенное в приложениях ESRI, что они не поддерживают этот подход?


person mwolfe02    schedule 17.03.2011    source источник
comment
С новым тэгом без VB6. Здесь нет вопроса VB6.   -  person Bob77    schedule 18.03.2011
comment
Я пометил этот VB6 из-за совпадения с VBA. Я предположил, что обсуждаемые здесь концепции в равной степени применимы как к VBA, так и к VB6. Пожалуйста, поправьте меня, если я ошибаюсь в своем предположении.   -  person mwolfe02    schedule 18.03.2011
comment
Вы правы, VBA и VB6 - это практически одно и то же, только у VBA нет компилятора для компиляции в машинный код, только движок псевдокода.   -  person DarinH    schedule 18.03.2011


Ответы (1)


Скорее всего, объект Esri неправильно поддерживает IDISPATCH. Вы можете попробовать CALLBYNAME, но я предполагаю, что это тоже не сработает, потому что я полагаю, что он также проходит через IDispatch.

person DarinH    schedule 17.03.2011
comment
Итак, первый пример (использующий раннее связывание) все еще может работать, если объект ESRI не поддерживает IDISPATCH? - person mwolfe02; 17.03.2011
comment
Да, раннее связывание не проходит через IDispatch, поэтому эти вызовы должны работать правильно. Это была бы довольно странная ситуация, но это, безусловно, возможно. Вы также можете иметь противоположное, объект, который поддерживает ТОЛЬКО IDISPATCH и вообще не предоставляет никаких других интерфейсов. Объекты, предназначенные только для использования в сценариях, иногда ведут себя так, хотя я больше не могу придумать ни одного... - person DarinH; 18.03.2011