Тема: Помогите запустить функцию ProgIDFromCLSID в VBA
Помогите запустить функцию ProgIDFromCLSID в VBA
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Помогите запустить функцию ProgIDFromCLSID в VBA
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Помогите запустить функцию 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
Понятно, что я настроил её чтобы она всегда выдавала значение ИСТИНА, но мне надо чтобы она выдавала по настоящему правдивую информацию. Помогите мне это сделать!
Так а где и что выдает ошибку?
Что вообще нужно? узнать версию Автокада?
Да! Вы правы уважаемый Александр Баусук! Этого я добиваюсь уже целую неделю наверное. Не бросайте меня пожалуйста и ответьте на вопрос.
Вот результат моих стараний:
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
Не осилил. Со связкой 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\....")
и так далее.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Помогите запустить функцию ProgIDFromCLSID в VBA
Форум работает на PunBB, при поддержке Informer Technologies, Inc