powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
12 сообщений из 12, страница 1 из 1
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38255446
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прога использует dll, в моем случае opal.dll

Dll и весь environment подгружается при старте приложения при запуске dll (ф-ция возвращает handle):

Код: vbnet
1.
2.
3.
Public Declare Function OpalInitialise Lib "opal.dll" (ByRef Version As Long, ByVal options As String) As Long

opal_hwnd = OpalInitialise(OPAL_C_API_VERSION, init_str)



При некоторых изменениях параметров работы мне надо полностью перегрузить environment,
т.е. я делаю:

Код: vbnet
1.
2.
3.
4.
Public Declare Function OpalShutDown Lib "opal.dll" (ByVal opal As Long) As Long

OpalShutDown opal_hwnd
opal_hwnd(new) = OpalInitialise(OPAL_C_API_VERSION, init_str)



Все это работает без крашей, НО:
Я обратил внимание, что потом при выполнении нек. ф-ций программа может давать (не сумел отдебажить почему, характер случайный) сбои (crash) ПОТОМ.

Также я обратил внимание на то что если сделать "паузу".

Код: vbnet
1.
2.
3.
OpalShutDown opal_hwnd
Msgbox "paused"
opal_hwnd(new) = OpalInitialise(OPAL_C_API_VERSION, init_str)



То на момент
Msgbox "paused"
я не могу ручками удалить "opal.dll"
Т.е. библиотека остается "подгруженной", хотя и не используется (старую конфигурацию выгрузили, новую еще не грузили).

Проблема:

Полностью закрываем VB6 приложение, потом делаем загрузку всего по новой -> все работает без сбоев

Просто перегружаем opal_hwnd (без закрытия VB6 обертки) -> могут быть определенные сбои при дальнейшей работе opal.dll


Есть конечно ручной способ загрузки-выгрузки
Код: vbnet
1.
2.
hMod = LoadLibrary("opal.dll")
FreeLibrary hMod


Но я как-то с этим игрался, мне что-то не понравилось, и я доверяюсь OpalInitialise, соответственно hMod мне не известен.

Я предполагаю, что простой способ решения проблемы - отцепить opal.dll от VB6 проги и полностью загрузить ее по новой.

Грубо говоря,
Как мне сделать
FreeLibrary hMod
если я не знаю этого hMod, но знаю имя dll.
Чтобы в режиме "остановки" (но без выгрузки VB6-проги) я мог ручками удалить "opal.dll", и винды мне это позволяли бы делать.
...
Рейтинг: 0 / 0
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38255493
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал такие варианты, не помогают. dll не удаляется, значит остается привязанной (лежит в папке с прогой)
Код: vbnet
1.
2.
3.
4.
      hMod = GetModuleHandle("opal.dll")
      'DisableThreadLibraryCalls hMod '????
      FreeLibrary hMod
      MsgBox "pause"
...
Рейтинг: 0 / 0
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38255559
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед использованием какой-либо функции нужно сделать LoadLibrary, а перед удалением либы FreeLibrary. C com-dll и поздним связыванием это работало.
...
Рейтинг: 0 / 0
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38255562
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, опять не дочитал :)
...
Рейтинг: 0 / 0
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38255567
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Но я как-то с этим игрался, мне что-то не понравилось,Слишком много эмоций, не имеющих отношения к делу. Дмитрий77и я доверяюсь OpalInitialise, соответственно hMod мне не известен.Одно другому не помешает.
...
Рейтинг: 0 / 0
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38255629
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,

а про то, что FreeLibrary может понадобиЦЦа сделать несколько раз, помним?
13144590
...
Рейтинг: 0 / 0
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38255741
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЦЦаДмитрий77,
а про то, что FreeLibrary может понадобиЦЦа сделать несколько раз, помним?

Да, вот так отвязывается, где-то с 3-ей итерации (а почему не с первой? вроде один раз ее грузил).
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
      Dim hMod As Long
      hMod = GetModuleHandle("opal.dll")
      'DisableThreadLibraryCalls hMod
      Dim FreeResult As Long
      FreeResult = 1
      Do Until FreeResult = 0 ' OK, library reference count is 0, and library is therefore unloadable
        FreeResult = FreeLibrary(hMod)
        Debug.Print FreeResult
      Loop
      MsgBox "pause"


Т.е. на MsgBox "pause" я могу удалить dll.

Но пока возникла другая проблема. Как только нажимаю на "OK" в Msgbox (это если в среде) или параллельно с Msgbox (это если в exe), прога VB6 делает crash (unknown module).
Пока не понял почему.
...
Рейтинг: 0 / 0
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38255826
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, опытным путем я нашел что такой код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
      opal_ShutDown (err_text)
      hOpal = 0
'      '-----------------------------
      Dim hMod As Long
      hMod = GetModuleHandle("opal.dll")
      Dim FreeResult As Long
      FreeResult = 1
      Do Until FreeResult = 0 ' OK, library reference count is 0, and library is therefore unloadable
        FreeResult = FreeLibrary(hMod)
        Debug.Print FreeResult
      Loop
      LoadLibrary "opal.dll"
       'restart Opal environment
      'start Opal


вроде как делает то что я хочу
1) не делает crash в процессе самой перезагрузки
2) не возникают случайные crash при дальнейшей работе

Т.е. я убиваю все library reference и тут же гружу dll снова через LoadLibrary не дожидаясь штатной загрузки через OpalInitialise.
Вроде прокатывает.
Количество убиваемых reference всякий раз хаотически меняется от 1 до нескольких.
Сколько нибудь разумных объяснений дать не могу.
Мож кто даст общее объяснение - для очистки совести по поводу того что делаю?
...
Рейтинг: 0 / 0
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38255863
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,

насчёт счётчика использования могу ещё раз дать ту же ссылку для внимательного прочтения.

Насчёт хаотичности - можно сделать "пошаговую" отладку, лучше EXE-шника вне IDE (форма, на ней кнопки "Шаг 1" - "Шаг N" и т. д.), но под Dependency Walker с включённым журналированием вызовов. Но, возможно (и есть подозрение, что скорее всего), хаотичности-то и нет.

Насчёт выгрузки библиотеки и тут же её загрузки, в сочетании с описанием функций библиотеки через Declare: это будет работать до тех пор, пока библиотека будет загружаЦЦа по тому же базовому адресу, что только что выгруженная.
...
Рейтинг: 0 / 0
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38255993
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЦЦа,

ЦЦаНасчёт выгрузки библиотеки и тут же её загрузки, в сочетании с описанием функций библиотеки через Declare: это будет работать до тех пор, пока библиотека будет загружаЦЦа по тому же базовому адресу, что только что выгруженная.
будет работать до тех пор Это до каких пор? Пока работает.

На самом деле непонятно две вещи:
1) Чего она иногда подглючивает при штатной перезагрузке opal_ShutDown/OpalInitialise (без выгрузок).
2) Чего она сразу глючит, если полностью выгрузить (и не переподгрузить). На момент выгрузки взаимодействия с dll как бы нет и handle закрыт. Причем специально проверял "в самом начале" -сразу после чистой загрузки OpalInitialise делал opal_ShutDown, без активации многочисленного функционала, т.е. когда ни какие-нибудь таймеры, ни коллбэк нагадить еще точно не могут - после тотального пинания через freelibrary VB6 однозначно вылетает.

Можно конечно полностью выгружать VB6 (а именно такую же картинку я и пытался симитировать но без выгрузки интерфейса), но как-то это не солидно, да и потом при перезапуске себя через shell будет ре-коннект к БД. А я на висте обнаружил какие-то проблемы (решать их не стал, сделал workaround) при коннекте к БД exe-шника запущенного через shell (в отличии от exe-шника запущенного ручками).

С другой стороны, сильно врубаться в эту философию тоже желания нет. Тем более тотальную перезагрузку надо делать только если пользователь полностью включает или выключает протокол (SIP или H.323), а пользователь в 99% будет сидеть в SIP, все же остальные перенастройки делаются "на ходу" без штатной перезагрузки. Если уж случится этот 1% и при этом таки вдруг вылетит (вероятность чего я думаю если не устранил, то свел к минимуму) ... ну запустит прогу заново и продолжит работу.
...
Рейтинг: 0 / 0
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38316096
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77ЦЦа,

ЦЦаНасчёт выгрузки библиотеки и тут же её загрузки, в сочетании с описанием функций библиотеки через Declare: это будет работать до тех пор, пока библиотека будет загружаЦЦа по тому же базовому адресу, что только что выгруженная.
будет работать до тех пор Это до каких пор? Пока работает.

На самом деле непонятно две вещи:
1) Чего она иногда подглючивает при штатной перезагрузке opal_ShutDown/OpalInitialise (без выгрузок).
2) Чего она сразу глючит, если полностью выгрузить (и не переподгрузить). На момент выгрузки взаимодействия с dll как бы нет и handle закрыт. Причем специально проверял "в самом начале" -сразу после чистой загрузки OpalInitialise делал opal_ShutDown, без активации многочисленного функционала, т.е. когда ни какие-нибудь таймеры, ни коллбэк нагадить еще точно не могут - после тотального пинания через freelibrary VB6 однозначно вылетает.

Проблема таки вылезает.
Если vb-шный exe-шник защитить AsProtect-ом то после такой перезагрузки (с перепихиванием через freelibrary/loadlibrary) все отлично работает, но когда потом (если была перезагрузка) прогу закрываешь, то в конце, когда все выгрузилось, выводится дурацкая ошибка Error103. Protection error.
А если не перепихивать freelibrary/loadlibrary, то вылезают случайные краши как писал, но опять же под маскировкой Error103. Protection error.

Т.е. даже не знаю что придумать. Проблемы я не понимаю.
Если только заменить restart dll рестартом всего VB-приложения... Вот этого делать не хочется. Муторно и результат непонятный.
...
Рейтинг: 0 / 0
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
    #38316948
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще конечно это неправильно что после полного FreeLibrary приложение ругается.
Я попробовал на своей простенькой dll и никакой ругани не обнаружил, хоть выгружай, хоть загружай,
хоть в любом состоянии вызывай ф-ции из dll(хоть одна ссылка, хоть много, хоть ни одной).
Видимо opal.dll слишком сложная. Разбираться с этим нормально еще сложнее.
Думаю баг opal-а. В старых версиях Opal вообще при выполнении
OpalInitialise -> OpalShutDown -> OpalInitialise, при втором OpalInitialise краш гарантировался. Сейчас хоть формально не ругается. Но видимо этот момент исправлен не до конца (по крайней мере в версии с кот. я работаю).

По хорошему для полной перезагрузки надо тупо выгружать VB екзешник и стартовать его по новой. Сделать это можно, например передачей управления заставке кот. отображается при "перезагрузке" (отдельный exe), но аккуратно делать муторно
(с восстановлением текущего состояния программы: отображаемые формы и т.п.).

Поэтому выкрутился пока по другому:
Error103. Protection error выдавал AsProtect из-за того что запаковывал им opal.dll. Цели защитить конкретно dll как бы не было, чисто перемешать слова при просмотре через hex-вьюеры.
Видимо AsProtect не справляется с этими мульти LoadLibrary/FreeLibrary играми, которые я делаю при перегрузке environment, буферизует ее и выдает в самом конце работы программы (зря они этот msgbox вставили).
Выкрутился просто используя AsPack (триальной версии достаточно) вместо AsProtect для перемешивания содержимого. AsPack мешает/пакует также, но при этом "ошибки 103" не выдает.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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