Страница: 1 | 2 |
Вопрос: Как программно подключить внешнюю библиотеку .TLB?
Добавлено: 29.11.07 16:30
Автор вопроса: LonerWanderer
В VBA через TOOLS - REFERENCES подключаю дополнительные библиотеки (или как там они правильно называются?). В зависимости от того, какая версия сторонней программы стоит у пользователя, необходимо программно подключить соответствующую библиотеку.
Например, acax16enu.tlb или acax17enu.tlb.
Как это сделать? (именно подключить саму библиотеку, проверку на версию я сделаю сам).
2 библиотеки от разных версий одновременно подключить не получается - выдает ошибку "Name conflicts with existing module, project, or object library"
Заранее спасибо.
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #1
Добавлено: 29.11.07 16:31
ЗЫ. Подключить и потом отключить.
Номер ответа: 2
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #2
Добавлено: 30.11.07 15:39
Это называется поздним связыванием.
Public acad As Object
...
If ... Then
Set acad = CreateObject("AutoCad.Application.16"
else
Set acad = CreateObject("AutoCad.Application.17"
End if
Номер ответа: 3
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #3
Добавлено: 30.11.07 16:15
А для такого связывания где должен находиться tlb-файл? Все время в папке с программой, или есть другие варианты?
Номер ответа: 4
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #4
Добавлено: 01.12.07 00:12
Да где угодно, лишь бы был зарегистрирован.
TLB - это, проще говоря, описание объектной модели какой-либо dll или ocx. Никакого исполняемого кода там нет.
Номер ответа: 5
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #5
Добавлено: 01.12.07 01:01
Номер ответа: 6
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #6
Добавлено: 01.12.07 01:07
То, что в реестре - знаю. Имеется ввиду регистрировать программно...
Номер ответа: 7
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #7
Добавлено: 01.12.07 03:54
http://www.vbaccelerator.com/home/VB/Utilities/Type_Library_Registration_Utility/Register_TypeLib_Source_Code_zip_mRegisterTypeLib_bas.asp
Номер ответа: 8
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #8
Добавлено: 03.12.07 09:45
Спасибо. Теперь знаю про раннее/позднее связывание.
По поводу позднего связывания.
Что-то не получается.
Делаю так.
Public ACADApp As Object
...
Sub ЗагрузкаПриложенияAcad2000()
Set ACADApp = CreateObject("AutoCAD.Application.17"
...
End Sub
Sub ОбработкаТекущегоЛистаACAD(i As Integer)
' Здесь мне нужно перебрать все элементы в пространстве листов.
' определяю переменную
Dim elem As AutoCAD.AcadEntity
For Each elem In ACADApp.ActiveDocument.PaperSpace
...
Next elem
Ошибка вылезает на строке
пишет User-defined type not defined
Также не помогает замена AutoCAD.AcadEntity на ACADApp.AcadEntity и на ACADApp.Application.AcadEntity.
При раннем связывании такой ошибки не возникает и все работает как надо.
Что я делаю не так?
Номер ответа: 9
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #9
Добавлено: 03.12.07 09:57
Имена процедур и функций лучше использовать на английском языке, и код пишется внутри этих процедур и функций, а не после.
Номер ответа: 10
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #10
Добавлено: 03.12.07 10:02
Короче, после объявления нужно добавить Set elem = New AutoCAD. Ну ты понял...
Номер ответа: 11
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #11
Добавлено: 03.12.07 12:16
Эта строка как и все объявления проверяется на начальном этапе компиляции и т.к. у "ACADApp As Object" нет св-ва .AcadEntity то вылетает ошибка.
Надо бы так:
Dim elem As Object
Set elem = AutoCAD.AcadEntity ' позднее связывание.
У меня нет автокада, так что проверить не могу.
Номер ответа: 12
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #12
Добавлено: 03.12.07 14:48
To: Arcady_XQST
Процедуры обрабатываются нормально. А код я вроде и так внутри написал (хотя на не локализованном офисе может быть это и не будет работать). Единственное - забыл в самом конце End Sub, но ведь здесь только кусок кода.
To: EUGY
К сожалению не получается.
Set elem = ACADApp.AcadEntity
Ругается на elem: Object doesn't support this property or method (Error 438)
Если elem не определять явно
Set elem = ACADApp.AcadEntity
то все равно никак.
Если вместо ACADApp. указывать AutoCad., то ругается, что переменная AutoCad не определена.
Через
Set elem = New ACADApp.AcadEntity
тоже ничего хорошего не происходит.
Номер ответа: 13
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #13
Добавлено: 03.12.07 15:52
Повторюсь, что у меня под рукой нет объектной модели автокада. Но насколько я понимаю ACADApp это корневой объект иерархии. Есть у него свойтво AcadEntity или нет, мне неизвестно, но т.к. Error 438 то видимо нет.
Если бы мне было очень надо я бы нашел дерево иерархии и выяснил бы например следующее:
Preferences
Documents
MenuBar
MenuGroups
http://cadhouse.nm.ru/articles/acad/acad_collection.html
Номер ответа: 14
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #14
Добавлено: 03.12.07 20:40
Ответ 10: без .ACADEntity попробуй, но врядли это поможет.
Номер ответа: 15
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #15
Добавлено: 05.12.07 18:19
В общем представляю рабочий код:
Public elem As Object
Public ACADApp As Object
.....
Sub ЗагрузкаПриложенияAcad200х()
Set ACADApp = CreateObject("AutoCAD.Application"
End Sub
Sub ОбработкаТекущегоЛистаACAD(i As Integer)
Set elem = ACADApp
Dim objSelSet
Dim objSelCol
Dim intType(0) As Integer
Dim varData(0) As Variant
...
BlockName = "Штамп"
Set objSelCol = ACADApp.ActiveDocument.SelectionSets
For Each objSelSet In objSelCol
If objSelSet.Name = "BlockSelect" Then
objSelSet.Delete
Exit For
End If
Next
Set objSelSet = objSelCol.add("BlockSelect"
intType(0) = 2
varData(0) = BlockName
objSelSet.Select 5, filtertype:=intType, filterdata:=varData
For Each elem In objSelSet
If elem.EntityName = "AcDbBlockReference" Then
With elem
...
call ЗаполнитьСтроку
End With
End If
Next elem
ACADApp.ActiveDocument.Close savechanges:=False
End Sub
Sub ЗакрытиеПриложенияAcad200x()
On Error GoTo ExitSub
Application.StatusBar = "Закрытие AutoCAD..."
ACADApp.Quit
ExitSub:
Application.StatusBar = ""
End Sub