Тема: Помогите запустить функцию ProgIDFromCLSID в VBA

Помогите запустить функцию ProgIDFromCLSID в VBA

Re: Помогите запустить функцию ProgIDFromCLSID в VBA

Нашёл в интернете описание функции ProgIDFromCLSID:

Declare Sub ProgIDFromCLSID Lib "ole32.dll" ( _
     ByVal clsid As Long, _
     ByVal lplpszProgID As String)

в программе APIViewer 2004 расположеной по адресу: http://www.activevb.de/rubriken/apiview … 4_v310.exe
и не могу понять каким образом можно конвертировать выражение вида "{C094C1E2-57C6-11D2-85E3-080009A0C626}" в длинное целое чтобы его можно было задать в качестве параметра clsid As Long
Пример моей функции следующий:

Private Function ПризнакНаличияВерсииAutoCAD(strGUID As String) As Boolean
Dim lplpszProgID As String, lngОтвет As Long
   ProgIDFromCLSID strGUID, lplpszProgID
   If Len(lplpszProgID) > 0 Then
'   If lngОтвет = -2147024809 Then
      ПризнакНаличияВерсииAutoCAD = True
   Else
      ПризнакНаличияВерсииAutoCAD = True
   End If
End Function

Понятно, что я настроил её чтобы она всегда выдавала значение ИСТИНА, но мне надо чтобы она выдавала по настоящему правдивую информацию. Помогите мне это сделать!

Re: Помогите запустить функцию ProgIDFromCLSID в VBA

Так а где и что выдает ошибку?
Что вообще нужно? узнать версию Автокада?

Re: Помогите запустить функцию ProgIDFromCLSID в VBA

Да! Вы правы уважаемый Александр Баусук! Этого я добиваюсь уже целую неделю наверное. Не бросайте меня пожалуйста и ответьте на вопрос.
Вот результат моих стараний:

Private Sub Workbook_Open()
Dim objReference As Object
Dim intКолвоБиблиотек As Integer
   If ПризнакНаличияВерсииAutoCAD("{851A4561-F4EC-4631-9B0C-E7DC407512C9}") Then ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.AddItem "AutoCAD2007"
   If ПризнакНаличияВерсииAutoCAD("{1EFD8E85-7F3B-48E6-9341-3C8B2F60136B}") Then ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.AddItem "AutoCAD2006"
   If ПризнакНаличияВерсииAutoCAD("{93BC4E71-AFE7-4AA7-BC07-F80ACDB672D5}") Then ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.AddItem "AutoCAD2004"
   If ПризнакНаличияВерсииAutoCAD("{8E75D910-3D21-11D2-85C4-080009A0C626}") Then ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.AddItem "AutoCAD2002"
   If ПризнакНаличияВерсииAutoCAD("{C094C1E2-57C6-11D2-85E3-080009A0C626}") Then ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.AddItem "AutoCAD2000"
On Error GoTo ОбработкаОшибок
'   Set objReference = Application.VBE.ActiveVBProject.References
ПодключитьБиблиотеку:
   Select Case ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD
      Case "AutoCAD2007" 'Подключение библиотеки типов AutoCAD2007
         Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{851A4561-F4EC-4631-9B0C-E7DC407512C9}", 1, 0)
      Case "AutoCAD2006" 'Подключение библиотеки типов AutoCAD2006
         Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{1EFD8E85-7F3B-48E6-9341-3C8B2F60136B}", 1, 1)
      Case "AutoCAD2004" 'Подключение библиотеки типов AutoCAD2004
         Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{93BC4E71-AFE7-4AA7-BC07-F80ACDB672D5}", 1, 1)
      Case "AutoCAD2002" 'Подключение библиотеки типов AutoCAD2002
         Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{8E75D910-3D21-11D2-85C4-080009A0C626}", 1, 1)
      Case "AutoCAD2000" 'Подключение библиотеки типов AutoCAD2000
         Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{C094C1E2-57C6-11D2-85E3-080009A0C626}", 1, 1)
   End Select
   gstrНачВерсияAutoCAD = ActiveWorkbook.Sheets(1).Range("ВерсияAutoCAD")
   Exit Sub
ОбработкаОшибок:
   If Err.Number = -2147319779 Then
      If ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.ListIndex < ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.ListCount Then
         ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.ListIndex = ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.ListIndex + 1
      Else
         ActiveWorkbook.Sheets(1).ComboBox1_ВерсияAutoCAD.ListIndex = 0
      End If
      intКолвоБиблиотек = intКолвоБиблиотек + 1
      If intКолвоБиблиотек < 5 Then GoTo ПодключитьБиблиотеку
   ElseIf Err.Number <> 32813 Then
      MsgBox "При подключении библиотеки произошла ОШИБКА!" & vbLf & vbLf & _
            "Номер ошибки = " & Err.Number & vbLf & vbLf & _
            "Описание ошибки: " & Err.Description, vbExclamation, gstrНазваниеПрограммы
   End If
   Resume Next
End Sub
Private Function ПризнакНаличияВерсииAutoCAD(strGUID As String) As Boolean
Dim lplpszProgID As String, lngОтвет As Long
Dim lngT As Long
   ProgIDFromCLSID strGUID, lplpszProgID
   lngОтвет = CLSIDFromProgID(strGUID, lngT)
   If Len(lplpszProgID) > 0 Then
'   If lngОтвет = -2147024809 Then
      ПризнакНаличияВерсииAutoCAD = True
   Else
      ПризнакНаличияВерсииAutoCAD = True
   End If
End Function

Сейчас при открытии Excel в ComboBox заполняются все версии AutoCAD, но некоторых нет на моём компютере. На одной из конференций мне посоветовали использовать для этих целей функцию CLSIDFromProgID(strGUID, lngT) я понял что она делает всё наоборот: выдаёт GUID по известному названию приложения, но всё равно решил попробовать её использовать. И эффект для обоих функций одинаковый: для разных версий AutoCAD они выдают одинаковый ответ, то есть этот ответ не меняется при смене версий AutoCAD. Но чтобы хоть как то работать я сделал чтобы функция всегда выдавала ИСТИНА. Мне надо научить мою функцию правильно разбираться какие версии установлены на компьтере а какие нет.
Описание функций API следующее:

Public Declare Sub ProgIDFromCLSID Lib "ole32" _
      (ByVal clsid As String, _
       ByVal lplpszProgID As String)
Public Declare Function CLSIDFromProgID Lib "ole32.dll" (ByRef TSzProgID As String, ByRef T As Long) As Long

Работа с ComboBoxom усуществляется следующими функциями:

Private Sub ComboBox1_ВерсияAutoCAD_Change()
Dim objReference As Object
On Error GoTo ОбработкаОшибок
   If blnПризнакИзмененияВерсии = False Then
'Отключим библиотеку не используемой версии AutoCAD
      Select Case gstrНачВерсияAutoCAD
         Case "AutoCAD2000" 'Отключение библиотеки типов AutoCAD2000
            Application.VBE.ActiveVBProject.References.Remove (ReferenceFromGuid("{C094C1E2-57C6-11D2-85E3-080009A0C626}"))
         Case "AutoCAD2002" 'Отключение библиотеки типов AutoCAD2002
            Application.VBE.ActiveVBProject.References.Remove (ReferenceFromGuid("{8E75D910-3D21-11D2-85C4-080009A0C626}"))
         Case "AutoCAD2004" 'Отключение библиотеки типов AutoCAD2004
            Application.VBE.ActiveVBProject.References.Remove (ReferenceFromGuid("{93BC4E71-AFE7-4AA7-BC07-F80ACDB672D5}"))
         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 objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{851A4561-F4EC-4631-9B0C-E7DC407512C9}", 1, 0)
            If TypeOf objReference Is Object  Then
               If Not objReference.isbroken Then MsgBox "AutoCAD2007 подключён", vbInformation, gstrНазваниеПрограммы
            End If
         Case "AutoCAD2006" 'Подключение библиотеки типов AutoCAD2006
            Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{1EFD8E85-7F3B-48E6-9341-3C8B2F60136B}", 1, 1)
            If TypeOf objReference Is Object  Then
               If Not objReference.isbroken Then MsgBox "AutoCAD2006 подключён", vbInformation, gstrНазваниеПрограммы
            End If
         Case "AutoCAD2004" 'Подключение библиотеки типов AutoCAD2004
            Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{93BC4E71-AFE7-4AA7-BC07-F80ACDB672D5}", 1, 1)
            If TypeOf objReference Is Object  Then
               If Not objReference.isbroken Then MsgBox "AutoCAD2004 подключён", vbInformation, gstrНазваниеПрограммы
            End If
         Case "AutoCAD2002" 'Подключение библиотеки типов AutoCAD2002
            Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{8E75D910-3D21-11D2-85C4-080009A0C626}", 1, 1)
            If TypeOf objReference Is Object  Then
               If Not objReference.isbroken Then MsgBox "AutoCAD2002 подключён", vbInformation, gstrНазваниеПрограммы
            End If
         Case "AutoCAD2000" 'Подключение библиотеки типов AutoCAD2000
            Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{C094C1E2-57C6-11D2-85E3-080009A0C626}", 1, 1)
            If TypeOf objReference Is Object  Then
               If Not objReference.isbroken Then MsgBox "AutoCAD2000 подключён", vbInformation, gstrНазваниеПрограммы
            End If
      End Select
      blnПризнакИзмененияВерсии = False
   End If
   Exit Sub
ОбработкаОшибок:
   If Err.Number = -2147319779 Then
      MsgBox "Версия " & ComboBox1_ВерсияAutoCAD & " отсутствует на компьютере", vbInformation, gstrНазваниеПрограммы
      blnПризнакИзмененияВерсии = True
      ComboBox1_ВерсияAutoCAD = gstrНачВерсияAutoCAD
      Err.Clear
      Select Case ComboBox1_ВерсияAutoCAD
         Case "AutoCAD2007" 'Подключение библиотеки типов AutoCAD2007
            Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{851A4561-F4EC-4631-9B0C-E7DC407512C9}", 1, 0)
         Case "AutoCAD2006" 'Подключение библиотеки типов AutoCAD2006
            Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{1EFD8E85-7F3B-48E6-9341-3C8B2F60136B}", 1, 1)
         Case "AutoCAD2004" 'Подключение библиотеки типов AutoCAD2004
            Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{93BC4E71-AFE7-4AA7-BC07-F80ACDB672D5}", 1, 1)
         Case "AutoCAD2002" 'Подключение библиотеки типов AutoCAD2002
            Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{8E75D910-3D21-11D2-85C4-080009A0C626}", 1, 1)
         Case "AutoCAD2000" 'Подключение библиотеки типов AutoCAD2000
            Set objReference = Application.VBE.ActiveVBProject.References.AddFromGuid("{C094C1E2-57C6-11D2-85E3-080009A0C626}", 1, 1)
      End Select
      blnПризнакИзмененияВерсии = False
      Exit Sub
   ElseIf Err.Number <> 32813 Then
      MsgBox "При подключении новой библиотеки произошла ОШИБКА!" & vbLf & vbLf & _
            "Номер ошибки = " & Err.Number & vbLf & vbLf & _
            "Описание ошибки: " & Err.Description, vbExclamation, gstrНазваниеПрограммы
   End If
   Resume Next
End Sub
Private Sub ComboBox1_ВерсияAutoCAD_Click()
   gstrНачВерсияAutoCAD = ComboBox1_ВерсияAutoCAD
   blnПризнакИзмененияВерсии = False
End Sub

Помогите правильно настроить ComboBox
Кстати я понял что все эти проблемы по сути своей надуманные и этих проблем моглы бы совсем не быть и не надо было бы использовать позднее связывание затрудняющее жизнь и творчество программистов если бы фирма Microsoft продолжила свой правильный курс по использованию GUID. Я где то читал, что GUID нужен для того чтобы пользователь как раз не имел проблем с подключением библиотек, а компютер сам бы определял какие библиотеки надо присоединить по названию приложения или по его GUID. Но кто-то решил использовать GUID не всего приложения, а для каждой библиотеки в отдельности. Поэтому теперь весь мир и мучается с подключением нужных библиотек. Это проделки врагов человечества тормозящих научно-технический прогресс. В самом деле неужели нельзя компьтер научить определять какая библиотека из всего списка библиотек сейчас требуется и подключть эту библиотеку чтобы программа Excel могла работать с работающей в данный момент версией AutoCAD. В лучшем варианте я бы хотел научить Excel именно это и делать:
1) запускаю Excel
2) даю команду обратиться к AutoCAD
3) Excel определяет какая версия AutoCAD сейчас работает (замечу что AutoCAD2007 и AutoCAD2000i могут одновремено работать вместе и находиться на панели задач, но фишка в том, что если библиотеки AutoCAD2000i пытаются обратиться к AutoCAD2007 то запускается бесконечное множество процессов Acad.exe и компьютер виснет. Этого я и хочу научиться избегать)
4) Excel отключает дежурную библиотеку (ранее подключеную)
5) Excel подключает библиотеку AutoCAD2007
6) Excel обращается к AutoCAD2007 без проблем.
Замечу что если библиотека AutoCAD2007 пытается обратиться к AutoCAD2000i то компютер виснет быстрее так как процессы Acad.exe2007 по видимому дольше загружаются и занимают больше места в памяти.
Помогите пожалуйста разобраться со всеми этими проблемами и если всё получится, то можно получить какой-нибудь приз от фирмы Microsoft!
Жду ответов уважаемый Александр Баусук!
Убедительная просьба ко всем: Помогите правильно запустить функции:

ProgIDFromCLSID
CLSIDFromProgID

Re: Помогите запустить функцию ProgIDFromCLSID в VBA

Не осилил. Со связкой Excel/Acad никогда не работал, извините. Но почему нельзя просто опрашивать ключи, я же вам писал:
Dim ScriptShell
Set ScriptShell = VBA.CreateObject("WScript.Shell")
IsVersion2005 = ScriptShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R16.1\ACAD-301:409")
IsVersion2006 = ScriptShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\....")
и так далее.