Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить) / 12 сообщений из 12, страница 1 из 1
13.05.2013, 16:34
    #38255446
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
Прога использует 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
13.05.2013, 17:07
    #38255493
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
Пробовал такие варианты, не помогают. dll не удаляется, значит остается привязанной (лежит в папке с прогой)
Код: vbnet
1.
2.
3.
4.
      hMod = GetModuleHandle("opal.dll")
      'DisableThreadLibraryCalls hMod '????
      FreeLibrary hMod
      MsgBox "pause"
...
Рейтинг: 0 / 0
13.05.2013, 17:46
    #38255559
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
Перед использованием какой-либо функции нужно сделать LoadLibrary, а перед удалением либы FreeLibrary. C com-dll и поздним связыванием это работало.
...
Рейтинг: 0 / 0
13.05.2013, 17:47
    #38255562
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
Блин, опять не дочитал :)
...
Рейтинг: 0 / 0
13.05.2013, 17:51
    #38255567
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
Дмитрий77Но я как-то с этим игрался, мне что-то не понравилось,Слишком много эмоций, не имеющих отношения к делу. Дмитрий77и я доверяюсь OpalInitialise, соответственно hMod мне не известен.Одно другому не помешает.
...
Рейтинг: 0 / 0
13.05.2013, 18:34
    #38255629
ЦЦа
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
Дмитрий77,

а про то, что FreeLibrary может понадобиЦЦа сделать несколько раз, помним?
13144590
...
Рейтинг: 0 / 0
13.05.2013, 20:15
    #38255741
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
ЦЦаДмитрий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
13.05.2013, 21:45
    #38255826
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
Ну, опытным путем я нашел что такой код
Код: 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
13.05.2013, 22:43
    #38255863
ЦЦа
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
Дмитрий77,

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

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

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

ЦЦаНасчёт выгрузки библиотеки и тут же её загрузки, в сочетании с описанием функций библиотеки через 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
01.07.2013, 17:21
    #38316096
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
Дмитрий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
02.07.2013, 12:25
    #38316948
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
Вообще конечно это неправильно что после полного 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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить) / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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