powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Замена Dll
25 сообщений из 27, страница 1 из 2
Замена Dll
    #34726742
Morion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем! У меня такой вопрос...

У меня есть программа, которая использует Dll. Время от времени программу надо обновлять. У длл у меня содержаться формы, рисунки. Как мне можно заменять Dll-файлы? Когда я пытаюсь сделать что-то вроде (Как я сделал с exe-шником)

Код: plaintext
1.
2.
DownloadFile "http://www.Sait.ru/proga/other.dll", App.Path + "\Other1.dll"
Name (App.Path + "\" + "Other.dll") As (App.Path + "\Other.dll.temp")  ' вот тут у мну ошибка
Name (App.Path + "\Other1.dll") As (App.Path + "\Other.dll")

Не получается заменить использующийся длл... что делать?
...
Рейтинг: 0 / 0
Замена Dll
    #34726908
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старую длл переименовать, новю записать, прогу перезапустить, старую стереть.
...
Рейтинг: 0 / 0
Замена Dll
    #34726949
Morion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Старую не получается переименовать! Я имею в виду во время работы программы надо всё это сделать...
...
Рейтинг: 0 / 0
Замена Dll
    #34727086
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если связывание раннее, то вообще забудь об этом. Если позднее, то перед ее использованием можно попробовать сделать LoadLibrary, а перед заменой FreeLibrary.
...
Рейтинг: 0 / 0
Замена Dll
    #34727134
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил, этот способ работает, главное не забыть перед этим уничтожить все объекты этой dll.
...
Рейтинг: 0 / 0
Замена Dll
    #34727142
Morion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А не мог бы ты немного поподробнее рассказать о Load- FreeLibrary?

...
Рейтинг: 0 / 0
Замена Dll
    #34727206
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
Public Declare Function FreeLibrary Lib "kernel32" Alias "FreeLibrary" (ByVal hLibModule As Long) As Long
Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Нет.
...
Рейтинг: 0 / 0
Замена Dll
    #34727344
Morion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я делаю так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Command1_Click()
Dim qqq
qqq = (App.Path & "\Other.dll")
FreeLibrary qqq
DownloadFile "http://www.Sait.ru/proga/other.dll", App.Path + "\Other1.dll"
Name (App.Path + "\" + "Other.dll") As (App.Path + "\Other.dll.temp")  ' вот тут у мну ошибка
Name (App.Path + "\Other1.dll") As (App.Path + "\Other.dll")
LoadLibrary (App.Path & "\Other.dll")
End Sub

Но при выполнении FreeLibrary qqq мне выдаётся ошибка: несовпадение типов.
...
Рейтинг: 0 / 0
Замена Dll
    #34727347
Morion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А, да.. в модуле я написал

Код: plaintext
1.
Public Declare Function FreeLibrary Lib "kernel32" Alias "FreeLibrary" (ByVal hLibModule As Long) As Long
Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
...
Рейтинг: 0 / 0
Замена Dll
    #34727407
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MorionСтарую не получается переименовать! Я имею в виду во время работы программы надо всё это сделать...

У меня проверка и обновление компонентов делается маленькой утилиткой, которая потом стартует основную программу. Утилитка не привязана к конкретной программе.
...
Рейтинг: 0 / 0
Замена Dll
    #34727426
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Н-да. Читать гугл не хотим.
MorionНо при выполнении FreeLibrary qqq мне выдаётся ошибка: несовпадение типов.Аргумент какого типа принимает FreeLibrary? Что подсовываешь вместо него?
AntonariyЕсли позднее, то перед ее использованием можно попробовать сделать LoadLibrary, а перед заменой FreeLibrary.Перед использованием означает в самом старте программы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public hLibrary as Long

Sub main()
hLibrary = LoadLibrary(App.Path & "\Other.dll")
End sub

Sub ReplaceLib()
FreeLibrary hLibrary 
DownloadFile "http://www.Sait.ru/proga/other.dll", App.Path + "\Other1.dll"
Name (App.Path + "\" + "Other.dll") As (App.Path + "\Other.dll.temp")  ' вот тут у мну ошибка
Name (App.Path + "\Other1.dll") As (App.Path + "\Other.dll")
hLibrary = LoadLibrary(App.Path & "\Other.dll")
...
Рейтинг: 0 / 0
Замена Dll
    #34727506
Morion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм...

Связывание - это когда необходимо присоеденить dll в окне Project->References?

Но если это не сделать, тогда программа вообще отказывается работать...

AndrF , в данном случае надо одной прогой.
...
Рейтинг: 0 / 0
Замена Dll
    #34727557
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если вот так по глупому... :)
Сделать пункт меню "Обновить длл"
Нажимаем на менюху
Закачиваем dll - ки в темповую папку
Затем делаем батничек в котором dll - ки из темпа будут переписывать существующие
Предпоследней строкой в батнике написать запуск самого приложения
Последней строкой записать удаление самого батника и все
Запуск батника повесить на событие выгрузки главной формы.
Нажали меню - накачали библиотек - создали скрипт для замены (в виде батника) - выгрузили приложение с запуском батника - батник заменил библиотеки - батник запустил прогу - батник замочил сам себя.

С уважением, Николай.
...
Рейтинг: 0 / 0
Замена Dll
    #34727581
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MorionХм...
AndrF , в данном случае надо одной прогой.

Лично мне удобней иметь одну утилитку на кучу программ, чем засовывать ее в каждую программу. Да и смысл в последнем?
...
Рейтинг: 0 / 0
Замена Dll
    #34727607
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MorionХм...

Связывание - это когда необходимо присоеденить dll в окне Project->References?

Но если это не сделать, тогда программа вообще отказывается работать...
Тогда забудь. Или делай с батником.
...
Рейтинг: 0 / 0
Замена Dll
    #34728532
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Morion,
я так понял, это ActiveX DLL. Надо попробовать выгрузить DLL перед заменой файла. Для этого надо все ссылки на объекты из этой библиотеки убить (Set ЭкземплярОбъекта = Nothing), можно также попытаться выкинуть её из адресного пространства процесса (Private Declare Sub CoFreeUnusedLibraries Lib "ole32" ()), проконтролировав результат с помощью Dependency Walker . Кроме того, надо бы озаботиться разрегистрацией старой версии библиотеки и регистрацией новой.
...
Рейтинг: 0 / 0
Замена Dll
    #34729238
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я так понял, что у него раннее связывание, поэтому все эти рекомендации не имеют смысла.
...
Рейтинг: 0 / 0
Замена Dll
    #34729732
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
должны иметь, если новые версии ActiveX DLL компилируются с опцией "Binary Compatibility" (как оно и должно быть, по-хорошему).
...
Рейтинг: 0 / 0
Замена Dll
    #34730066
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктAntonariy,
должны иметь, если новые версии ActiveX DLL компилируются с опцией "Binary Compatibility" (как оно и должно быть, по-хорошему).
Antonariy прав - все эти рекомендации не имеют смысла, ибо при раннем связывании заменить эту библиотеку все равно не удастся, даже если поубивать все ссылки и вызвать CoFreeUnusedLibraries.
...
Рейтинг: 0 / 0
Замена Dll
    #34730117
Morion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бенедикт , а как разрегистрировать старую библ.? как регистрировать я вродь понял, а вот разрегистрировать...

А не можешь немного рассказать о Binary Compatibility?
...
Рейтинг: 0 / 0
Замена Dll
    #34730359
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может для разрегистрации подойдет такой код

Код: plaintext
Shell "regsvr32 /u" & "Путь к библиотеке"

С уважением, Николай.
...
Рейтинг: 0 / 0
Замена Dll
    #34730384
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или такой:

Код: 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.
'*************************************************************
' Регистрирует/дерегистрирует указанный файл
'*************************************************************
Public Function RegSvr(sFileName As String, Optional bRegister As Boolean = False) As Long
    Const ERR_CANT_LOAD =  4 &
    Const ERR_NO_ENTRY_POINT =  5 &
    Const ERR_CANT_REGISTER =  6 &
    
    Dim lb As Long, pa As Long, s As String, ss As String
    If g_bWin98 Or g_bWinNT4 Then
        s = GetSystemDirectory
        If Not bRegister Then ss = "/u "
        If StartFile(s & "RegSvr32.exe /s " & ss & sFileName) Then RegSvr = ERR_CANT_REGISTER
    Else
        lb = LoadLibrary(sFileName)
        If lb Then
            s = IIf(bRegister, "DllRegisterServer", "DllUnregisterServer")
            pa = GetProcAddress(lb, s)
            If pa Then
                If CallWindowProc(pa, ByVal  0 &, ByVal  0 &, ByVal  0 &, ByVal  0 &) Then RegSvr = ERR_CANT_REGISTER
            Else
                RegSvr = ERR_NO_ENTRY_POINT
            End If
            FreeLibrary lb
        Else
            RegSvr = ERR_CANT_LOAD
        End If
    End If
End Function
...
Рейтинг: 0 / 0
Замена Dll
    #34730551
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
Melkiades,
это мои мысли вслух. Конечно, следует провести эксперимент, чтобы убедиться (отчасти я такой эксперимент проводил с DAO, выкидывая её из памяти процесса на время, пока она не нужна, но без смены "на лету"). А что беспокоит вас?

Morion,
по binary compatibility можно почитать документацию по VB6 в старых версиях MSDN Library, или, вкратце, здесь .

По (раз-)регистрации - либо дёрнуть явно соответствующую точку входа (один из способов см. во второй части кода, приведённого AndrF), либо вызвать regsvr32.exe с нужными ключами (при этом очень желательно дождаться окончания процесса регистрации).
...
Рейтинг: 0 / 0
Замена Dll
    #34733526
Morion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мда.. а не подскажите, как тогда сделать позднее связывание? Насколько я понял, так может что-то получиться...

...
Рейтинг: 0 / 0
Замена Dll
    #34733908
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Morion,
если DLL блокируется исполняющимся процессом, придётся выполнять вышеописанные танцы вне зависимости от вида связывания. IMHO :^)
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Замена Dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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