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

У меня есть программа, которая использует 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
14.08.2007, 15:14
    #34726908
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
Старую длл переименовать, новю записать, прогу перезапустить, старую стереть.
...
Рейтинг: 0 / 0
14.08.2007, 15:24
    #34726949
Morion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
Старую не получается переименовать! Я имею в виду во время работы программы надо всё это сделать...
...
Рейтинг: 0 / 0
14.08.2007, 15:52
    #34727086
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
Если связывание раннее, то вообще забудь об этом. Если позднее, то перед ее использованием можно попробовать сделать LoadLibrary, а перед заменой FreeLibrary.
...
Рейтинг: 0 / 0
14.08.2007, 16:02
    #34727134
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
Проверил, этот способ работает, главное не забыть перед этим уничтожить все объекты этой dll.
...
Рейтинг: 0 / 0
14.08.2007, 16:04
    #34727142
Morion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
А не мог бы ты немного поподробнее рассказать о Load- FreeLibrary?

...
Рейтинг: 0 / 0
14.08.2007, 16:16
    #34727206
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
Код: 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
14.08.2007, 16:46
    #34727344
Morion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
Я делаю так:

Код: 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
14.08.2007, 16:47
    #34727347
Morion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
А, да.. в модуле я написал

Код: 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
14.08.2007, 17:01
    #34727407
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
MorionСтарую не получается переименовать! Я имею в виду во время работы программы надо всё это сделать...

У меня проверка и обновление компонентов делается маленькой утилиткой, которая потом стартует основную программу. Утилитка не привязана к конкретной программе.
...
Рейтинг: 0 / 0
14.08.2007, 17:07
    #34727426
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
Н-да. Читать гугл не хотим.
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
14.08.2007, 17:30
    #34727506
Morion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
Хм...

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

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

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

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

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

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

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

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

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

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

Код: 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
15.08.2007, 18:27
    #34730551
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена Dll
Antonariy,
Melkiades,
это мои мысли вслух. Конечно, следует провести эксперимент, чтобы убедиться (отчасти я такой эксперимент проводил с DAO, выкидывая её из памяти процесса на время, пока она не нужна, но без смены "на лету"). А что беспокоит вас?

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

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

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


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