Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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-файл?

Да где угодно, лишь бы был зарегистрирован.
TLB - это, проще говоря, описание объектной модели какой-либо dll или ocx. Никакого исполняемого кода там нет.

Ответить

Номер ответа: 5
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #5 Добавлено: 01.12.07 01:01
Да где угодно, лишь бы был зарегистрирован.
Возникает вопрос, как его регистрировать? :) Явно, не как ActiveX...

Ответить

Номер ответа: 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


Ошибка вылезает на строке
Dim elem As AutoCAD.AcadEntity

пишет 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
Dim elem As AutoCAD.AcadEntity

Эта строка как и все объявления проверяется на начальном этапе компиляции и т.к. у "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
К сожалению не получается.
Dim elem As Object
Set elem = ACADApp.AcadEntity

Ругается на elem: Object doesn't support this property or method (Error 438)
Если elem не определять явно
Dim 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 то видимо нет.
Если бы мне было очень надо я бы нашел дерево иерархии и выяснил бы например следующее:
Корневой объект AutoCAD ActiveX Automation Object Model — объект Application. Все остальные объекты его наследники. На верхней ступени находятся объекты:
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

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам