powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Проблема с коллекцией References. Не получается програмное удаление ссылок.
7 сообщений из 7, страница 1 из 1
Проблема с коллекцией References. Не получается програмное удаление ссылок.
    #32790545
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот с какой проблемой я столкнулся и пока не нашел решения. Советы в MSDN есть, но они почему-то не работают.

Мой файл MDB использует ссылки на хорошо всем знакомые библиотеки ADODB и ADOX.

НО! При запуске на другой машине с другой версией MS Office, отличной от моей ver. 2003, а именно XP, 2000 не находятся ссылки на нужные версии библиотек. ADODB можно подключить из набора 2.1 ... 2.8 более старую 2.5, благо они лежат на машине всем букетом, новые добавляются к имеющимся старым. С ADOX такой фокус не проходит - его версию надо указывать конкретно - 2.5, 2.7, 2.8.

При открытии startup формы можно програмно проверить коллекцию ссылок и найти те, которые broken. Но удалить паламатую ссылку и подключить на ее место хорошую нельзя - при удалении возникает ошибка. Подключить новую без удаления старой тоже нельзя - возникает конфликт версий.

Тогда я поступил таким образом:

1. удалил руками через меню tools|references ссылки на ADODB и ADOX

2. в startup форме подключаю их по известному GUID и номерам версии. Сначала пробую подключить более старшие версии, затем, в случае неуспеха, перебираю более младшие, пока не подключиться - работает ОК.

3. startup форма делается невидимой на все время работы приложения - ОК

4. в unload событии startup формы програмно удаляются хорошие рабочие ссылки на ADODB и ADOX - работает ОК. Для диагностики после удаления выводится списко оставшихся в коллекции References ссылок - все как надо.
Событие unload формы startup вызывается при выходе из приложения.

5. А вот теперь самое обидное. При следующем открытии MDB с загрузкой или без загрузки startup формы СВОЛОЧНЫЕ ССЫЛКИ ВСЕ РАВНО уже есть! Если открывать под лругой версией офиса, то опять будет ошибка. Плохая ссылка не удаляется.

Вот подключение ссылок в startupe:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    Dim ref As Reference
    With Application.References
        On Error Resume Next
        'ADODB версии 2.5
        .AddFromGuid "{00000205-0000-0010-8000-00AA006D2EA4}",  2 ,  5 
        Err.Clear
        'ADOX разных версий от 2.8 вниз
        .AddFromGuid "{00000600-0000-0010-8000-00AA006D2EA4}",  2 ,  8 
        If Err.Number <>  0  Then
            Err.Clear
            .AddFromGuid "{00000600-0000-0010-8000-00AA006D2EA4}",  2 ,  7 
        End If
        If Err.Number <>  0  Then
            Err.Clear
            .AddFromGuid "{00000600-0000-0010-8000-00AA006D2EA4}",  2 ,  6 
        End If
        If Err.Number <>  0  Then
            Err.Clear
            .AddFromGuid "{00000600-0000-0010-8000-00AA006D2EA4}",  2 ,  5 
        End If
    End With

А вот unload формы startup:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    MsgBox "Removing References..."
    Dim ref As Reference
    'Один вариант
    'For Each ref In Application.References
    '    If ref.Guid = "{00000600-0000-0010-8000-00AA006D2EA4}" Or _
    '       ref.Guid = "{00000205-0000-0010-8000-00AA006D2EA4}" Then
    '        Application.References.Remove ref
    '    End If
    'Next ref
    'Или другой вариант
    Application.References.Remove Application.References!ADODB
    Application.References.Remove Application.References!ADOX
    'В этот момент на экране видно, что удаленных ссылок не осталось
    For Each ref In Application.References
        MsgBox ref.Name & " " & ref.Major & "." & ref.Minor
    Next ref
    'Но при следующем запуске они снова на месте
...
Рейтинг: 0 / 0
Проблема с коллекцией References. Не получается програмное удаление ссылок.
    #32791043
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люди! Памагите! Неужели никто не сталкивался ? Надо же в конце концов свои проекты пользователям устанавливать...
...
Рейтинг: 0 / 0
Проблема с коллекцией References. Не получается програмное удаление ссылок.
    #32791056
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри тут:
/topic/97521#719310
...
Рейтинг: 0 / 0
Проблема с коллекцией References. Не получается програмное удаление ссылок.
    #32792814
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это все мелкософтовская херня, связанная с проблемами распространения приложений MsOffice
...

Надо определяться :
Каким путем идти - официальным или своим.
Если посмотреть как совместить их, то получается следующее :
Официальный предусматривает создание дистрибутива приложения и его инсталляцию на каждую
машину клиента, тогда будут и ссылки не поломаны и библиотеки все зарегестрированы,
НО! И тут могут потребоваться адаптации приложения, ввиду, вообще говоря, несовметимости продуктов MS снизу вверх
по линейке своих продуктов (иначе бы ,скажем, новые версии того же ADO DAO просто перекрывали бы старые
, ан нет - они сосуществуют под разными номерами на одном компе)
Да и всегда будет проблема совместимости сверху вниз - когда разработано на ,скажем, Office2002
а хочется , чтобы это работало на Office 2000,98,97,95, потому что на компах юзеров именно они стоят!
Видно проблема "сверху вниз" только решается требованием, чтобы стояло не ниже Office2002,
Но вот , вроде бы Office2002 далеко не у всех есть, а вот скажем Office2000 можно практически всегда поставить всем,
т.к. аппаратные возможности позволяют. Отсюда ,ну и с учетом его возможностей , можно ориенироваться при разработке на Office2000.

Когда с Office'ом решено, нужно требовать его наличия у пользователей.

Далее, если смотреть на подключаемае библиотеки, то их ,вообще говоря, может быть немеряно в проекте, все не реанимируешь,
да и не предполагает это MicroSoft - считается, что ссылки должны быть привязаны, а библиотеки на которые они указаны зарегестрированы в системе,
только при этих условиях проект м.б. корректно откомпилирован!
Поэтому, надо научиться распространять до приложения еще и среду в которой оно может работать,
не зря сейчас .NET приложения требуют для своей работы .Net Framework, которая ,кстати сказать, весит 2 десятка мегов - у MS чем дальше, тем страшнее.
Я , например, на предприятии , где использовались мои Office приложения , на
сервере в общей папке держал библиотеки, которые устанавливались на все заинтересованные в них компы, сделать это можно как средствами сетевого администрирования, так и при 1-м запуске приложения, которое от них зависит, правда это вариант, типа твоего, но он ,как ты уже понял, не очень надежный. Лучше инсталлировать среду работы отдельно на каждый копм юзера, только придумать, как в твоих условиях это сделать удобнее.

Хочу еще раз сказать, в Windows от процесса деплоинга с инсталляцией никуда не деться,
надо только это хорошо для себя понять , хоть и кажется что можно просто кидать
по пользователям MDB,DOC,XLS и пр. файлы MsOffice.
Поэтому надо наиболее удобно решить для себя эту задачу принципиально, с учетом наиболее общего случая разработки приложения.
...
Рейтинг: 0 / 0
Проблема с коллекцией References. Не получается програмное удаление ссылок.
    #32794100
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть две новости по злоклятые референсы.

Одна - хорошая: все заработало.
Вторая - плохая: я не отследил четко, в какой момент это произошло.

Как я говорил, приложение очищается от всех ссылок кроме встроенных. Переписывается на новое место. Запускается. При запуске в ищет подходящую библиотеку по ГУИДу и постепенно опуская номер версии.
При выгрузке выкидывает подключенные таким макаром библиотеки.

Выгрузка приложения контролируется формой, которая загружается сдалана автозагружаемой в параметрах запуска. Потом она скрывается, но остается все время загруженной.

Для очистки совести пишется лог файл при запуске и лог при выходе.

При загрузке этой формы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
    bCanClose = False

    Open Application.CurrentProject.Path & "\\" & "Application.Log.Startup" For Output As # 1 
    Print # 1 , "Starting Application", Now
    Print # 1 , ""
    
    Dim ref As Reference
    For Each ref In Application.References
        If Not ref.IsBroken Then
            Print # 1 , ref.Name, ref.Major, ref.Minor, ref.Guid, ref.FullPath
        Else
            Print # 1 , "<Broken reference>", ref.Major, ref.Minor, ref.Guid, ""
        End If
    Next ref
    
    With Application.References
        On Error Resume Next
        Print # 1 , "AddFromGuid ""{00000205-0000-0010-8000-00AA006D2EA4}"", 2, 5"
        .AddFromGuid "{00000205-0000-0010-8000-00AA006D2EA4}",  2 ,  5 
        If Err.Number <>  0  Then
            Print # 1 , Err.Number, Err.Description
            Err.Clear
        End If
        
        Print # 1 , "AddFromGuid ""{00000600-0000-0010-8000-00AA006D2EA4}"", 2, 8"
        .AddFromGuid "{00000600-0000-0010-8000-00AA006D2EA4}",  2 ,  8 
        If Err.Number =  0  Then GoTo ADD_REFERENCE_OK
        Print # 1 , Err.Number, Err.Description
        Err.Clear
        
        Print # 1 , "AddFromGuid ""{00000600-0000-0010-8000-00AA006D2EA4}"", 2, 7"
        .AddFromGuid "{00000600-0000-0010-8000-00AA006D2EA4}",  2 ,  7 
        If Err.Number =  0  Then GoTo ADD_REFERENCE_OK
        Print # 1 , Err.Number, Err.Description
        Err.Clear
        
        Print # 1 , "AddFromGuid ""{00000600-0000-0010-8000-00AA006D2EA4}"", 2, 6"
        .AddFromGuid "{00000600-0000-0010-8000-00AA006D2EA4}",  2 ,  6 
        If Err.Number =  0  Then GoTo ADD_REFERENCE_OK
        Print # 1 , Err.Number, Err.Description
        Err.Clear
        
        Print # 1 , "AddFromGuid ""{00000600-0000-0010-8000-00AA006D2EA4}"", 2, 6"
        .AddFromGuid "{00000600-0000-0010-8000-00AA006D2EA4}",  2 ,  5 
        If Err.Number =  0  Then GoTo ADD_REFERENCE_OK
        Print # 1 , Err.Number, Err.Description
        Err.Clear
        
    End With
    
ADD_REFERENCE_OK:
    Close # 1 

При выгрузке:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
Private Sub btnClose_Click()
On Error GoTo Err_Label

    If bCanClose Then
        DoCmd.Close acForm, Me.Name
    Else
        Me.Visible = False
    End If

Exit_Label:
    Exit Sub

Err_Label:
    MsgBox Err.Description
    Resume Exit_Label
    
End Sub

Private Sub Form_Unload(Cancel As Integer)

    If Not bCanClose Then
        Cancel = True
        bCanClose = True
        Beep
        Me.lblReference.Caption = "До свидания !"
        Me.lblProcess.Caption = ""
        Me.btnClose.Caption = "Закончить работу с системой"
        Me.Visible = True
        Exit Sub
    End If
    
    bCanClose = True
    Cancel = False
    
    Open Application.CurrentProject.Path & "\\" & "Application.Log.Close" For Output As # 1 
    Print # 1 , "Exiting Application", Now
    Print # 1 , ""
    Dim ref As Reference
    For Each ref In Application.References
        If Not ref.IsBroken Then
            Print # 1 , ref.Name, ref.Major, ref.Minor, ref.Guid, ref.FullPath
        Else
            Print # 1 , "<Broken reference>", ref.Major, ref.Minor, ref.Guid, ""
        End If
    Next ref
    
    Print # 1 , ""
    Print # 1 , "Removing", Application.References!ADODB.Name, Application.References!ADODB.Guid
    Print # 1 , "Removing", Application.References!ADOX.Name, Application.References!ADOX.Guid
    
    Beep
    Application.References.Remove Application.References!ADODB
    DoEvents
    Beep
    Application.References.Remove Application.References!ADOX
    DoEvents
    Beep
    
    Print # 1 , ""
    For Each ref In Application.References
        If Not ref.IsBroken Then
            Print # 1 , ref.Name, ref.Major, ref.Minor, ref.Guid, ref.FullPath
        Else
            Print # 1 , "<Broken reference>", ref.Major, ref.Minor, ref.Guid, ""
        End If
    Next ref
    Close # 1 
    
    Application.Quit

End Sub

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Starting Application        22.11.2004 13:18:22 

VBA            4             0            {000204EF-0000-0000-C000-000000000046}    C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6.DLL
Access         9             0            {4AFFC9A0-5F99-101B-AF4E-00AA003F0F07}    C:\Program Files\Microsoft Office\OFFICE11\MSACC.OLB
stdole         2             0            {00020430-0000-0000-C000-000000000046}    C:\WINDOWS\SYSTEM32\STDOLE2.TLB

AddFromGuid "{00000205-0000-0010-8000-00AA006D2EA4}", 2, 5
AddFromGuid "{00000600-0000-0010-8000-00AA006D2EA4}", 2, 8

Exiting Application         22.11.2004 13:18:27 

VBA            4             0            {000204EF-0000-0000-C000-000000000046}    C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6.DLL
Access         9             0            {4AFFC9A0-5F99-101B-AF4E-00AA003F0F07}    C:\Program Files\Microsoft Office\OFFICE11\MSACC.OLB
stdole         2             0            {00020430-0000-0000-C000-000000000046}    C:\WINDOWS\SYSTEM32\STDOLE2.TLB
ADODB          2             5            {00000205-0000-0010-8000-00AA006D2EA4}    C:\Program Files\Common Files\System\ado\msado25.tlb
ADOX           2             8            {00000600-0000-0010-8000-00AA006D2EA4}    C:\Program Files\Common Files\System\ado\msADOX.dll

Removing      ADODB         {00000205-0000-0010-8000-00AA006D2EA4}
Removing      ADOX          {00000600-0000-0010-8000-00AA006D2EA4}

VBA            4             0            {000204EF-0000-0000-C000-000000000046}    C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6.DLL
Access         9             0            {4AFFC9A0-5F99-101B-AF4E-00AA003F0F07}    C:\Program Files\Microsoft Office\OFFICE11\MSACC.OLB
stdole         2             0            {00020430-0000-0000-C000-000000000046}    C:\WINDOWS\SYSTEM32\STDOLE2.TLB
...
Рейтинг: 0 / 0
Проблема с коллекцией References. Не получается програмное удаление ссылок.
    #32794267
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если интересно - сделал так:

при запуске проверяется версия MDAC
если ниже 2.8 то запуск Setup MDAC28 c сетевого диска и Application.Quit

ибо не факт что написанное для 2.8 будет работать без глюков в младших версиях.

если же касается библиотек используемых в приложении
то в автоекзеке идет проверка если референса нет
извлечь файл из таблицы с бинари файла в системную папку, зарегистрировать и перезапустить аксесс.

если нужны подробности как именно можно проверить версию или
технология извлечения библиотек из таблиц и восстановления референсов
могу дать примеры кода
...
Рейтинг: 0 / 0
Проблема с коллекцией References. Не получается програмное удаление ссылок.
    #32794656
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача стояла как запуск приложения на компьютере пользователя с отличной от компьютера разработчика средой без модификации компьютера оного пользователя.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Проблема с коллекцией References. Не получается програмное удаление ссылок.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]