Тема: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

Придумал небольшой способ адаптировать программы к разным версиям AutoCAD! Просто надо выбрать версию с которой работаем из списка. Но вот заполняется пока этот список всеми возможными версиями AutoCAD и если выбрать из этого списка версию которая не установлена на компьютере или файл библиотеки которой не зарегистрирован то файл программы Excel перестаёт компилироваться так как он отключается от рабочей библиотеки и не подключается к не найденой. Чтобы избежать подобных ситуаций надо заполнять список только имеющимися версиями AutoCAD. Для этого надо по известному GUID библиотеки найти зарегистрирована эта бибилиотека в системе или нет. Если зарегистрирована то добавлять в список а если нет то не добавлять.

Private Sub ComboBox1_ВерсияAutoCAD_Click()
   strНачВерсияAutoCAD = ComboBox1_ВерсияAutoCAD
End Sub
Private Sub ComboBox1_ВерсияAutoCAD_Change()
Dim objReferences As Object
On Error Resume Next
'Отключим библиотеку не используемой версии AutoCAD
   Select Case strНачВерсияAutoCAD
      Case "AutoCAD2000" 'Отключение библиотеки типов AutoCAD2000
         Application.VBE.ActiveVBProject.References.Remove (ReferenceFromGuid("{C094C1E2-57C6-11D2-85E3-080009A0C626}"))
      Case "AutoCAD2006" 'Отключение библиотеки типов AutoCAD2006
         Application.VBE.ActiveVBProject.References.Remove (ReferenceFromGuid("{1EFD8E85-7F3B-48E6-9341-3C8B2F60136B}"))
      Case "AutoCAD2007" 'Отключение библиотеки типов AutoCAD2007
         Application.VBE.ActiveVBProject.References.Remove (ReferenceFromGuid("{851A4561-F4EC-4631-9B0C-E7DC407512C9}"))
   End Select
'Подключим библиотеку используемой версии AutoCAD
   Select Case ComboBox1_ВерсияAutoCAD
      Case "AutoCAD2007" 'Подключение библиотеки типов AutoCAD2007
         Set objReferences = Application.VBE.ActiveVBProject.References.AddFromGuid("{851A4561-F4EC-4631-9B0C-E7DC407512C9}", 1, 1)
         If TypeOf objReferences Is Object  Then
            If Not objReferences.isbroken Then MsgBox "AutoCAD2007 подключён", vbInformation, gstrНазваниеПрограммы
         End If
      Case "AutoCAD2006" 'Подключение библиотеки типов AutoCAD2006
         Set objReferences = Application.VBE.ActiveVBProject.References.AddFromGuid("{1EFD8E85-7F3B-48E6-9341-3C8B2F60136B}", 1, 1)
         If TypeOf objReferences Is Object  Then
            If Not objReferences.isbroken Then MsgBox "AutoCAD2006 подключён", vbInformation, gstrНазваниеПрограммы
         End If
      Case "AutoCAD2000" 'Подключение библиотеки типов AutoCAD2000
         Set objReferences = Application.VBE.ActiveVBProject.References.AddFromGuid("{C094C1E2-57C6-11D2-85E3-080009A0C626}", 1, 1)
         If TypeOf objReferences Is Object  Then
            If Not objReferences.isbroken Then MsgBox "AutoCAD2000 подключён", vbInformation, gstrНазваниеПрограммы
         End If
   End Select
End Sub
Private Function ReferenceFromGuid(strGuid As String) As Variant
Dim objReference As Object
   For Each objReference In Application.VBE.ActiveVBProject.References
      If objReference.GUID = strGuid Then
         Set ReferenceFromGuid = objReference
         Exit Function
      End If
   Next
End Function

Добавление библиотек в список происходит при открытии рабочей книги Excel:

Private Sub Workbook_Open()
Dim objReferences As Object
   ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.AddItem "AutoCAD2000"
   ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.AddItem "AutoCAD2002"
   ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.AddItem "AutoCAD2004"
   ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.AddItem "AutoCAD2006"
   ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.AddItem "AutoCAD2007"
On Error Resume Next
   Select Case ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD
      Case "AutoCAD2007" 'Подключение библиотеки типов AutoCAD2007
         Set objReferences = Application.VBE.ActiveVBProject.References.AddFromGuid("{851A4561-F4EC-4631-9B0C-E7DC407512C9}", 1, 1)
      Case "AutoCAD2006" 'Подключение библиотеки типов AutoCAD2006
         Set objReferences = Application.VBE.ActiveVBProject.References.AddFromGuid("{1EFD8E85-7F3B-48E6-9341-3C8B2F60136B}", 1, 1)
      Case "AutoCAD2000" 'Подключение библиотеки типов AutoCAD2000
         Set objReferences = Application.VBE.ActiveVBProject.References.AddFromGuid("{C094C1E2-57C6-11D2-85E3-080009A0C626}", 1, 1)
   End Select
End Sub

В этой процедуре и надо проверять по известному GUID наличие библиотек в системе. Как это сделать? Может быть есть специальные функции API?

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

А зачем так-то? А если использовать позднее связывание? НА манер:

Dim objACAD as Object
Set objACAD = GetObject(,"AutoCAD.Application")

Ну и так далее, естественно, создавая объект при необходимости.

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

GetObject(,"AutoCAD.Application") я использую далее и если подключена не та библиотека то AutoCAD не подключается. Чтобы AutoCAD подключался и надо перед началом подключения выбрать нужную библиотеку.
Кстати можно ещё усовершенствовать выбор нужной библиотеки:
1. Определить самой программе VBA с какой версией AutoCAD надо програмно соединиться. (что в первом способе должен делать сам пользователь самостоятельно)
2. Подключить нужную библиотеку и дать работать программе далее самостоятельно.
Удивительно почему программисты AutoCAD не сделали этого сами, а заставляют пользователей мучиться с подключением разных библиотек.
Например у меня на работе AutoCAD2007 а дома AutoCAD2002 и если я настрою библиотеки на работе я не мог работать с этими файлами дома и наоборот. Теперь я просто выбираю из ComboBoxa нужную версию AutoCAD и работаю без проблем. Правда если выбрать версию библиотеки которой нет на компьютере то новая библиотека не подключаются и программа не выполняется и требуется подключать библиотеку вручную.
По минимуму мне надо понять как определить по известному GUID есть ли такая библиотека на компьютере (наверное надо делать поиск в реестре).
По максимуму мне надо научить программу самой разбираться к какой активной в даный момент версии AutoCAD обращается пользователь и подключить соответствующую библиотеку. Главное чтобы для каждой версии был правильно указан GUID и программа сама подключит библиотеку.
Если кто специалист в этом вопросе подскажите пожалуйста!
Кстати в области подключения различных библиотек VBA наверное впереди ObjectARX где все рабочие модули компилируются из расчёта работы только с одной версией AutoCAD. Получается в этом вопросе VBA лучше ObjectARX!

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

> Миша
Пример kpblc самый простой и надежный.
Приведите участок кода, который у вас не работает в каком-нибудь автокаде(дах). А то не ясно, в чем проблема.

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

> Миша
В моем варианте используется позднее связывание (обрати внимание на объявление переменных). Поэтому библиотеки (по крайней мере в VB 6.0) подключать не только не нужно, но и вообще вредно. То есть сноси их и компилируй проект по новой.

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

На счёт позднего связывания ничего не понимаю. Если я отключаю все библиотеки то компилятор даже не запускается. Напоминаю в своей программе я пытаюсь подсоединиться к AutoCAD из Excel. Если отключить библиотеки AutoCAD в Reference то компилятор не понимает типы переменых AutoCAD и программа не работает. А если подключить не ту версию библиотеки 2006 вместо 2007 то Excel начинает периодически создавать новые процессы Acad.exe в менеджере файлов а к открытому чертежу AutoCAD2007 не даёт доступа. Excel просто не видит этот чертёж или считает его не той версии. Через некоторое время компьютер виснет и приходит вручную через менеджер файлов останавливать Excel. А если подключить библиотеку AutoCAD2007 и запустить чертёж в AutoCAD2007 то Excel прекрасно видит этот чертёж и делает внём всё что надо.
Поэтому мне надо научить Excel самостоятельно понимать к какой версии AutoCAD устанавливается подключение и подключать (предварительно отключив не нужную) подходяшую версию библиотеки AutoCAD. В самом лучшем случае мне бы хотелось чтобы это сделали программисты AutoCAD а нам пользователям давали бы ссылку на одну постояную библиотеку которая сама разбиралась бы в какой версии надо компилировать код программы чтобы он правильно работал. Но до программистов AutoCAD добраться очень сложно, поэтому я прошу помощи у ВАС коллеги, помогите пожалуйста!
Вот код программы в котором возникает ошибка:

On Error Resume Next
   If ПриложениеAutoCAD Is Nothing Then
ПроверитьПолучениеAutoCAD:
      Set ПриложениеAutoCAD = VBA.GetObject(, "AutoCAD.Application")
      If ПриложениеAutoCAD Is Nothing Then
         Set ПриложениеAutoCAD = VBA.GetObject("", "AutoCAD.Application")
         GoTo ПроверитьПолучениеAutoCAD
      Else
         GoTo СделатьAutoCADВидимым
      End If
   End If
   If DetectAutoCAD = 0 Then GoTo ПроверитьПолучениеAutoCAD

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

Может, это поможет?
http://word.mvps.org/faqs/InterDev/Earl … inding.htm
http://www.dicks-clicks.com/excel/olBinding.htm
http://support.microsoft.com/default.as … -US;245115
http://en.wikipedia.org/wiki/Late_binding

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

> Миша

Dim objACAD as [b]Object[/b]

Или

Private

или

Public

В зависимости от того, что нужно.
Это первое. Напишите так. И все дожно заработать.
Второе. Если Вы используете объекты присутствующие во всех версиях, то все будет нормально работать и без распознавания версий.
Но! Например, цвет в 2004 сделан не так как в 2002. Если Вы используете цвет в разных версиях, то тут без распознавания версий не обойтись.

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

Точнее

Dim ПриложениеAutoCAD  as Object

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

И еще. При позднем связывании все константы надо заменить на соответствующие им числовые значения!

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

> brigval
Уважаемый brigval у меня в программе столько использунтся типов переменных AutoCAD что у меня "не хватит дня" все их заменить на object.
К тому же отлаживать такую программу неприятно и неудобно. И честно говоря очень не хочется заменять в программе слово Acad на Object.
И мне не верится что после строк кода

     Set ПриложениеAutoCAD = VBA.GetObject(, "AutoCAD.Application")
      If ПриложениеAutoCAD Is Nothing Then
         Set ПриложениеAutoCAD = VBA.GetObject("", "AutoCAD.Application")

подключатся нужные библиотеки и всё может работать если при компилировании открывается окно References... и там пишется "MISSING: AutoCAD2007 type library". Неужели при получении ссылки на активный AutoCAD нужные билиотеки сами подключаются?

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

И мне не верится что после строк кода
А Вы не спрашивайте, а попробуйте. Только ссылки на АКАДы уберите.

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

> Миша
Дело Ваше. Вы спросили - Вам ответили...

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

> Миша
кстати объектные модели у разных версий AutoCAD разные.
различие конечно же не "кардинальное", но... иногда может попортить нервы.
там параметр добавлен... сям вызов по-другому... и т.п
зы. так что в "большом сурьезном" проекте ваш способ адаптации будет только половинчатым решением.
ну и судя по сомнениям знания матчасти весьма и весьма скромные.  :)

Re: Как узнать есть ли на компьютере версия AutoCAD по известному GIUD

Версии использующие позднее связывание методом использования вместо типов переменых AutoCAD типы Object прошу не предлагать, так как при этом теряется качество программирования, код программы выглядит некрасиво и такую программу сложно модернизировать или улучшать. Мне кажется должны быть для работы с GUID специальные функции Windows API. Подскажите пожалуйста какие функции Windows API надо использовать.
Код который я написал выше прекрасно работает и у меня небыло бы проблем если бы пользователю предлагался список только установленых программ на компютере. Поэтому надо правильно заполнить этот список. Помогите мне это сделать.