|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
Прога использует dll, в моем случае opal.dll Dll и весь environment подгружается при старте приложения при запуске dll (ф-ция возвращает handle): Код: vbnet 1. 2. 3.
При некоторых изменениях параметров работы мне надо полностью перегрузить environment, т.е. я делаю: Код: vbnet 1. 2. 3. 4.
Все это работает без крашей, НО: Я обратил внимание, что потом при выполнении нек. ф-ций программа может давать (не сумел отдебажить почему, характер случайный) сбои (crash) ПОТОМ. Также я обратил внимание на то что если сделать "паузу". Код: vbnet 1. 2. 3.
То на момент Msgbox "paused" я не могу ручками удалить "opal.dll" Т.е. библиотека остается "подгруженной", хотя и не используется (старую конфигурацию выгрузили, новую еще не грузили). Проблема: Полностью закрываем VB6 приложение, потом делаем загрузку всего по новой -> все работает без сбоев Просто перегружаем opal_hwnd (без закрытия VB6 обертки) -> могут быть определенные сбои при дальнейшей работе opal.dll Есть конечно ручной способ загрузки-выгрузки Код: vbnet 1. 2.
Но я как-то с этим игрался, мне что-то не понравилось, и я доверяюсь OpalInitialise, соответственно hMod мне не известен. Я предполагаю, что простой способ решения проблемы - отцепить opal.dll от VB6 проги и полностью загрузить ее по новой. Грубо говоря, Как мне сделать FreeLibrary hMod если я не знаю этого hMod, но знаю имя dll. Чтобы в режиме "остановки" (но без выгрузки VB6-проги) я мог ручками удалить "opal.dll", и винды мне это позволяли бы делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2013, 16:34 |
|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
Пробовал такие варианты, не помогают. dll не удаляется, значит остается привязанной (лежит в папке с прогой) Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2013, 17:07 |
|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
Перед использованием какой-либо функции нужно сделать LoadLibrary, а перед удалением либы FreeLibrary. C com-dll и поздним связыванием это работало. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2013, 17:46 |
|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
Блин, опять не дочитал :) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2013, 17:47 |
|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
Дмитрий77Но я как-то с этим игрался, мне что-то не понравилось,Слишком много эмоций, не имеющих отношения к делу. Дмитрий77и я доверяюсь OpalInitialise, соответственно hMod мне не известен.Одно другому не помешает. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2013, 17:51 |
|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2013, 18:34 |
|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
ЦЦаДмитрий77, а про то, что FreeLibrary может понадобиЦЦа сделать несколько раз, помним? Да, вот так отвязывается, где-то с 3-ей итерации (а почему не с первой? вроде один раз ее грузил). Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Т.е. на MsgBox "pause" я могу удалить dll. Но пока возникла другая проблема. Как только нажимаю на "OK" в Msgbox (это если в среде) или параллельно с Msgbox (это если в exe), прога VB6 делает crash (unknown module). Пока не понял почему. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2013, 20:15 |
|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
Ну, опытным путем я нашел что такой код Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
вроде как делает то что я хочу 1) не делает crash в процессе самой перезагрузки 2) не возникают случайные crash при дальнейшей работе Т.е. я убиваю все library reference и тут же гружу dll снова через LoadLibrary не дожидаясь штатной загрузки через OpalInitialise. Вроде прокатывает. Количество убиваемых reference всякий раз хаотически меняется от 1 до нескольких. Сколько нибудь разумных объяснений дать не могу. Мож кто даст общее объяснение - для очистки совести по поводу того что делаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2013, 21:45 |
|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
Дмитрий77, насчёт счётчика использования могу ещё раз дать ту же ссылку для внимательного прочтения. Насчёт хаотичности - можно сделать "пошаговую" отладку, лучше EXE-шника вне IDE (форма, на ней кнопки "Шаг 1" - "Шаг N" и т. д.), но под Dependency Walker с включённым журналированием вызовов. Но, возможно (и есть подозрение, что скорее всего), хаотичности-то и нет. Насчёт выгрузки библиотеки и тут же её загрузки, в сочетании с описанием функций библиотеки через Declare: это будет работать до тех пор, пока библиотека будет загружаЦЦа по тому же базовому адресу, что только что выгруженная. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2013, 22:43 |
|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
ЦЦа, ЦЦаНасчёт выгрузки библиотеки и тут же её загрузки, в сочетании с описанием функций библиотеки через 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% и при этом таки вдруг вылетит (вероятность чего я думаю если не устранил, то свел к минимуму) ... ну запустит прогу заново и продолжит работу. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2013, 05:02 |
|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
Дмитрий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-приложения... Вот этого делать не хочется. Муторно и результат непонятный. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2013, 17:21 |
|
Как временно "отвязать" dll от VB-проги (чтобы файл "dll" можно было при этом удалить)
|
|||
---|---|---|---|
#18+
Вообще конечно это неправильно что после полного 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" не выдает. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2013, 12:25 |
|
|
start [/forum/topic.php?fid=60&gotonew=1&tid=2156879]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
11ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 265ms |
total: | 427ms |
0 / 0 |