Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Как отловить изменения references  [new]
AVVS
Member

Откуда:
Сообщений: 335
А не подскажет ли всезнающий разум, как сделать вот такую штуку:

В проекте Access в окошке VBA/Tools/References я регистрирую все внешние приложения, .OCX, .DLL и т.п., которые используются в проекте. Но беда в том, что при этом учитывается версия. И когда я это приложение ставлю на пользовательскую машину, то е него могут быть свои версии этих приложений. И, естественно, приходится ручками эти references прописывать. Т.е. просто так приложение может и не установиться - надо руками его... Опять же, если приложение изменилось, то все по новой :(

Так вот вопрос - можно ли как-то автоматизировать этот процесс, или сделать так, чтобы при регистрации внешних приложений не учитывалась версия?

Заранее спасибо,
avvs
12 фев 05, 09:45    [1317346]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить изменения references  [new]
msn13
Member

Откуда: Скорый поезд №42
Сообщений: 1372
ты хочешь услышать полное мнение или как?
если не длл на компе, то а какой ссылке на нее ты говоришь?
что значит не учитывалась версия
если ты используешь ссылку на оффис 2000 а стоит только 97, то естественно
необходимо просто поставить 00 оффис и т.д.
12 фев 05, 18:01    [1317702]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить изменения references  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
Надо проверить, какие GUID имеют другие версии библиотек и использовать програмное подключение . Я проделал такую штуку для ADODB, ADOX и теперь при старте приложения линкую нужные библиотеки начиная со старшей версии. Если 3.0 не находится, то перебирается 2.9, 2.8 и т.д.

В качестве иллюстрации:

Public Function CheckReference( _
    sName As String, Optional iMajor As Integer, Optional iMinor As Integer, _
    Optional sGUID As String, Optional sFullPath As String) As Boolean

    Open Application.CurrentProject.Path & "\\" & "Application.Log" For Append As #1
    
    Dim ref As Reference
    For Each ref In Application.References
        If Not ref.IsBroken Then
            If ref.Name = sName Then
                iMajor = ref.Major: iMinor = ref.Minor
                sGUID = ref.Guid:   sFullPath = ref.FullPath
                Print #1, "CheckReference", _
                    ref.Name, ref.Major, ref.Minor, ref.Guid, ref.FullPath
                Print #1, "": Close #1
                If Verbose Then
                    MsgBox ref.Name & ", " & _
                        ref.Major & ", " & ref.Minor & ", " & _
                        ref.Guid & ", " & ref.FullPath
                End If
                CheckReference = True
                Exit Function
            End If
        End If
    Next ref
    
    CheckReference = False
    Print #1, "CheckReference Failed", sName
    Print #1, "": Close #1
    Exit Function

End Function

Public Function LinkReferenceFromGUID( _
    sName As String, _
    dbMaxVersion As Double, dbMinVersion As Double, _
    sGUID As String _
) As Double
    
    On Error Resume Next
    LinkReferenceFromGUID = 0#
    
    Dim lnkReference As LinkReference
    Set lnkReference = New LinkReference
    lnkReference.Initialize sName, sGUID, dbMaxVersion, dbMinVersion
    
    Open Application.CurrentProject.Path & "\\" & "Application.Log" For Append As #1
    Print #1, "LinkReferenceFromGUID", lnkReference.Name, lnkReference.Guid, "from", dbMaxVersion, "to", dbMinVersion
    
    Dim version As Double, iMajor As Integer, iMinor As Integer
    If dbMinVersion = 0# Then dbMinVersion = dbMaxVersion
    For version = dbMaxVersion To dbMinVersion Step -0.1
        iMajor = Int(version)
        iMinor = Int((version - iMajor) * 10 + 0.01)
        Application.References.AddFromGuid lnkReference.Guid, iMajor, iMinor
        DoEvents
        If Err.Number = 0 Then
            Set lnkReference.Reference = _
                Application.References.Item(Application.References.Count)
            ReferenceCollection.Add lnkReference, sName
            Print #1, "AddFromGuid", _
                lnkReference.Reference.Name, _
                lnkReference.Reference.Major, lnkReference.Reference.Minor, _
                lnkReference.Reference.Guid, lnkReference.Reference.FullPath
            Print #1, ""
            Close #1
            If Verbose Then
                MsgBox _
                    "AddFromGuid" & " " & _
                    lnkReference.Reference.Name & " " & _
                    lnkReference.Reference.Major & " " & _
                    lnkReference.Reference.Minor & " " & _
                    lnkReference.Reference.Guid & " " & _
                    lnkReference.Reference.FullPath
            End If
            LinkReferenceFromGUID = version
            Exit Function
        Else
            Print #1, "AddFromGuid", _
                lnkReference.Name, iMajor, iMinor, _
                lnkReference.Guid, "Error", Err.Number, Err.Description
            If Verbose Then
                MsgBox _
                    "AddFromGuid" & " " & lnkReference.Name & " " & _
                    iMajor & " " & iMinor & " " & lnkReference.Guid & _
                    "Error" & " " & Err.Number & " " & Err.Description
            End If
            Err.Clear
        End If
    Next version

    If Verbose Then
        MsgBox _
            "LinkReferenceFromGUID Failed" & " " & _
            lnkReference.Name & " " & _
            lnkReference.MaxVersion & " " & _
            lnkReference.MinVersion & " " & _
            lnkReference.Guid
    End If
    Print #1, "LinkReferenceFromGUID Failed"
    Print #1, ""
    Close #1
    LinkReferenceFromGUID = 0
    Exit Function

End Function
    
Public Function LinkADODB() As Double

    Dim Name As String, Major As Integer, Minor As Integer, _
        Guid As String, FullPath As String
    Name = "ADODB"
    If CheckReference(Name, Major, Minor, Guid, FullPath) Then
        LinkADODB = Major + Minor / 10
    Else
        LinkADODB = _
            LinkReferenceFromGUID( _
                "ADODB", 3#, 2.8, _
                "{2A75196C-D9EB-4129-B803-931327F72D5C}")
        If LinkADODB = 0# Then LinkADODB = _
            LinkReferenceFromGUID( _
                "ADODB", 2.7, 2.7, _
                "{EF53050B-882E-4776-B643-EDA472E8E3F2}")
        If LinkADODB = 0# Then LinkADODB = _
            LinkReferenceFromGUID( _
                "ADODB", 2.6, 2#, _
                "{00000206-0000-0010-8000-00AA006D2EA4}")
    End If
    
End Function

Public Function LinkADOX() As Double

    Dim Name As String, Major As Integer, Minor As Integer, _
        Guid As String, FullPath As String
    Name = "ADOX"
    If CheckReference(Name, Major, Minor, Guid, FullPath) Then
        LinkADOX = Major + Minor / 10
    Else
        LinkADOX = _
            LinkReferenceFromGUID( _
                "ADOX", 3#, 2#, _
                "{00000600-0000-0010-8000-00AA006D2EA4}")
    End If
    
End Function
12 фев 05, 23:19    [1317833]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить изменения references  [new]
AVVS
Member

Откуда:
Сообщений: 335
Программист-Любитель
Надо проверить, какие GUID имеют другие версии библиотек и использовать програмное подключение . Я проделал такую штуку для ADODB, ADOX и теперь при старте приложения линкую нужные библиотеки начиная со старшей версии. Если 3.0 не находится, то перебирается 2.9, 2.8 и т.д.



Похоже это то, что нужно.
Спасибо!
13 фев 05, 19:53    [1318358]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить