Как заставить DLL выгружаться из памяти в случае ошибки ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Как заставить DLL выгружаться из памяти в случае ошибки ?

Сообщение ALX_2002 » 12.01.2005 (Ср) 12:32

Трабл следующий -

Создали объект через CreateObject("....")

Но забыли его выгрузить или в коде программы произошла ошибка и его удаление (Set OBJ=Nothing) не произошло

И винда не даёт заменить DLL файл пока тот не будет выгружен

Как этого избежать ?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.01.2005 (Ср) 12:49

Поиметь где-нить указатель на объект и вызывать Release, пока не сдохнет.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.01.2005 (Ср) 13:02

Хм... И как это сделать....? :shock:

Дело в том, что с DLL Tyomith-a траблов нету. Хоть ошибка, хоть что.... у него как то выгружается....

Интересно как он это сделал.... :roll:

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Как заставить DLL выгружаться из памяти в случае ошибки

Сообщение codemaster » 12.01.2005 (Ср) 13:06

ALX_2002 писал(а):....
Но забыли его выгрузить или в коде программы произошла ошибка и его удаление (Set OBJ=Nothing) не произошло
....


1. Вспомнить и выгрузить
2.Обработать ошибку

скорее всего твой софт пал жертвой Circular References

http://www.vbaccelerator.com/home/VB/Co ... rticle.asp


'
//<-
Mit freundlichen Grüßen
//->

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.01.2005 (Ср) 13:18

"Мой SOFT" :( - ASP страница, на которой иногда происходят ошибки, как это не печально.

И трабл в том, что если на странице сначала создаётся объект, а потом

происходит ошибка, то этот объект висит в памяти сервера оочень

долго.... и DLL при этом нельзя ни удаляить ни изменить ни т.п

И что делать в этом случае я пока что не знаю....


Жду советов.... :roll:

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 12.01.2005 (Ср) 13:26

по-умолчанию IIS держит сессию 20 минут (можно уменьшить значение)
твоя dll-ка если лежит под COM+ , то там есть настройка сколько она будет держаться в памяти (по-молчанию кажется 3 минуты)

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 12.01.2005 (Ср) 13:27

ALX_2002 писал(а):"Мой SOFT" :( - ASP страница, на которой иногда происходят ошибки, как это не печально.
Жду советов.... :roll:


Где создается объект ?
Кусок кода?
Что в ASPError ?


P.S. Restart WEB сервера думаю "освободит" объект
//<-
Mit freundlichen Grüßen
//->

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 12.01.2005 (Ср) 13:50

Konst_One писал(а):по-умолчанию IIS держит сессию 20 минут (можно уменьшить значение)
твоя dll-ка если лежит под COM+ , то там есть настройка сколько она будет держаться в памяти (по-молчанию кажется 3 минуты)



Бред
есть большая разница между

Код: Выделить всё
<% Set MyObj = Server.CreateObject("......") %>


<% Set Session("MyObj") = Server.CreateObject(".....")%>


неговоря о том что и разместить эти стрки можно в разных местах!
Последний раз редактировалось codemaster 12.01.2005 (Ср) 13:51, всего редактировалось 1 раз.
//<-
Mit freundlichen Grüßen
//->

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.01.2005 (Ср) 13:51

Ок. Привожу код как ASP так и DLL

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

Это часть кода ASP

Код: Выделить всё
STREAM.OpenFile(PATH)

With Response
  .Buffer = true
  .ContentType = "application/binary"
  .AddHeader "Content-Length",STREAM.GetFileLen
  .AddHeader "Content-Disposition","attachment;filename=" & FileName
End With

BitsRead=100

Do
  Bits=Stream.ReadFile(BitsRead)
  Response.BinaryWrite Bits
  If BitsRead < 1000000 then
   'Увеличение скорости после начала скачки
   BitsRead=BitsRead+1000
  End if
  Response.Flush
  If Not Response.IsClientConnected Then Exit Do
Loop until Bits=""

STREAM.CloseFile
Set STREAM=Nothing



Dll - ка

Код: Выделить всё
Public Function OpenFile(Path As Variant) As Variant
On Error Resume Next
If fnum = 0 Then
   fnum = FreeFile
   Open Path For Binary Access Read As #fnum
End If
If Err.Number <> 0 Then OpenFile = Err.Description
End Function

Public Function CloseFile() As Variant
On Error Resume Next
Close #fnum
fnum = 0
CloseFile = Err.Description
End Function

Public Function ReadFile(Bytes As Variant) As Variant
On Error Resume Next
If Bytes > LOF(fnum) - Loc(fnum) Then Bytes = LOF(fnum) - Loc(fnum)
ReadFile = InputB(Bytes, #fnum)
End Function


Таким образом я читаю двоичный файл и возвращаю его кусками.

Я предполагаю, что в DLL ке нужно что то добавить - событие какое то что ли..... Чтобы Release происходил.... И кстати как его юзать... :?: :roll:

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 12.01.2005 (Ср) 13:56

[quote="ALX_2002"]Ок. Привожу код как ASP так и DLL

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

Это часть кода ASP
.....

[quote]

Этот код бесполезен при решении твоей проблеммы :(

остается вопрос Где создается объект ?
(STREAM )
смотри выше и

http://msdn.microsoft.com/library/defau ... ssions.asp

http://msdn.microsoft.com/library/defau ... m_seso.asp
//<-
Mit freundlichen Grüßen
//->

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.01.2005 (Ср) 14:05

Виноват. Создаю я его так

Код: Выделить всё
Set STREAM = CreateObject("Binary.Stream")


А потом весь код ASP

Почитал по ссылкам. К сожалею мало чего понял, потому как с

с с сессионными созданиями объектов не работал. :oops:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: YaCy [Bot] и гости: 20

    TopList